🖥

こわくない xargs ( 初心者のためのシェル入門 )

2023/08/26に公開

基本

標準出力を受け取って他のコマンドに渡すことが出来る。

echo Bob Carol | xargs echo

Bob Carol

「置換文字」を指定する

--replace または -I オプションを付けると「置換用の文字」を指定できる。

たとえば次の例だと SomeStringBob Carol に置換される。

echo Bob Carol | xargs --replace=SomeString echo Alice SomeString David

Alice Bob Carol David

file コマンドと組み合わせる

よく使う例。

ファイルの準備

echo "Alice" > ./alice.txt
echo "Bob" > ./bob.txt
echo "Carol" > ./carol.txt

普通に find するとこんな感じ

find ./ -type f

./carol.txt
./bob.txt
./alice.txt

xargs と組み合わせて利用

SomeFile がファイル名に置換されて、全てのファイルを cat で読むことが出来る。

find ./ -type f | xargs --replace=SomeFile cat SomeFile

Carol
Bob
Alice

ちなみにこの場合、find の結果は3行あるため、3回の評価がおこなわれる。

複数のコマンドを xargs と組み合わせる場合

bash / sh コマンドを利用して、その中に置換文字を埋め込んでやれば良い。

cat して echo の両方を使う例

find ./ -type f | xargs --replace=SomeFile bash -c "cat SomeFile && echo SomeFile"

Carol
./carol.txt
Bob
./bob.txt
Alice
./alice.txt

「コマンドの中にコマンド」ではうまくいかない

メインコマンドよりも「コマンドの中のコマンド」 $() の方が先に走ってしまい、必然的に文字置換の処理も起こらない。

find ./ -type f | xargs --replace=SomeFile $(cat SomeFile && echo SomeFile)

cat: SomeFile: No such file or directory

環境

  • GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)

Gist

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2018-07-26

Discussion