Skip to the content. Bash-Oneliner I am glad that you are here! I was working on bioinformatics a few years ago and was amazed by those single-word bash commands which are much faster than my dull scripts, time saved through learning command-line shortcuts and scripting. Recent years I am working on cloud computing and I keep recording those useful commands here. Not all of them is oneliner, but i
ちょっと多めのファイルを手軽に移動させたいときに 早めに終わらせたい場合 nohup bash -c "find <src directory> -type f -mindepth 1 -maxdepth 1 | xargs -t -P8 cp -t <target directory>" & nohupで切れないように xargsに-tをつけてログを出しておく depthのoptionは間違い防止 再帰的にcpされても問題ないなら要らない xargsのPでprocess並列 cpやmvは-tでtarget directoryを先に書けるのでxargsのとき便利 時間がかかってもよい場合はrsyncを使うと進捗がわかりやすく確実 rsync -auz --info=progress2 --no-inc-recursive <src directory>/ <target directory
xargs では -P オプションを使うことで並列処理させることが可能です。 # -P2 の 2 の数は何個並列で走らせるかを表す $ ... | xargs -P2 [目次] 最大実行数の確認 実験 並列処理されてること 論理 CPU を超えた場合 おわりに 最大実行数の確認 論理 CPU の数は、以下のいずれかの方法で取得可能です。 # 以下ディレクトリのファイルの中身を見てプロセッサの数を確認 (linux)。 $ cat /proc/cpuinfo | grep processor | wc -l 4 # 以下の変数でも確認が可能。 $ echo $(nproc) 4 xargs にそのままぶち込むことも可能です。 # 全ての .png ファイルを、convert を使って .jpg に変換する例。 $ ls *.png | sed 's/\.png//' | xargs -P$(
xargs -P を使って並列で圧縮・ファイル転送する # 10000 行のファイルを作成する perl -le 'printf(qq/%05d\n/, $_) for 1..10000' > total # 1000 行ごとにファイルを分割する split --numeric-suffixes=1 -l 1000 total splited_ # 8 並列で圧縮する find . -type f -name 'splited_*' -print0|xargs -0 -I{} -P8 gzip # 8 並列でファイル転送する find . -type f -name 'splited_*.gz -print0|xargs -0 -I{} -P8 aws s3 cp {} s3://awssampledb/test/
久しぶりなので小ネタ。 環境 macOS Big Sur 11.7 なにごと? いつものように xargs -I でコマンドを置換して諸々やっていたのですが、あるときなぜかうまく置換されないことがあったのです。 これは期待どおり。 $ echo 'short' | xargs -I@ echo '[@]' [short] しかし xargs に渡す値が長くなると置換されず、 -I で指定した文字がそのまま出てきてしまう…。 $ echo 'looo(中略)ooong' | xargs -I@ echo '[@]' [@] 調べてみる というわけで man を見てみると… $ man xargs XARGS(1) BSD General Commands Manual XARGS(1) NAME xargs -- construct argument list(s) and execute
xargsについて気にしなければならないことがやたら多いので覚書を作成した。 1. findで用がすむ場合 xargsの左側の大半はfindだと思われるが、 findで全部すむのならfindですました方がよい。 なおfindでもxargsのように複数の行を結合してforkを減らすことができる。 (exec command {} +等) 2. -0オプションについて POSIXではないが-0オプションでnull文字を区切り文字として扱う。 こうすると空白文字やクォーテーション等の文字が含まれていても 分割やエスケープが行われない。 入力側がnull文字区切りに対応している必要がある。 3. 特定の文字列をデリミタ代わりにする回避策 改行がデリミタとして使えるのであればスペース,タブをエスケープすれば良い。 入力がファイルパスの場合、正規化された表現なら、 "//"は含まれないはずなので、fi
ruby で同時処理のスレッド制御 でスレッド制御しながら、キューを使わずコマンドを並列実行してきた。 よく考えたら、こんな車輪の再発明などしなくても先人の知恵を借りたほうが楽そう。 調べてみたらxargsに同時実行のオプションがあるのを確認した。 max-procsのこのオプションを知って、せっかく覚えたての find -exec 投げ捨てたくなった xargs 最強じゃないですか。 xargs にコマンドを並列実行する方法がある。 -P/ --max-procs オプション --max-procs=max-procs -P max-procs Run up to max-procs processes at a time; the default is 1. If max-procs is 0, xargs will run as many processes as possib
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く