
Bashでは、次のような結果が出ると予想されます。
ls *.py | xargs -I{} echo $(echo {} | sed 's/\.py/_2\.py/g')
ディレクトリに含まれるすべての.pyファイルが一覧表示されますが、ファイル名の後に.py拡張子の前に_2が追加されます。
しかしそうではありません。変更なしでディレクトリの.pyファイルのみを一覧表示します。
簡単に言うと:
$ ls
A.py B.py
$ ls *.py | xargs -I{} echo $(echo {} | sed 's/\.py/_2\.py/g')
A.py
B.py
私の予想結果は次のとおりです。
A_2.py
B_2.py
ここで何が起こっているのか、予想される出力を取得する方法は?
答え1
これはサブシェルのコマンドです。
echo {} | sed 's/\.py/_2\.py/g'
エコー前に実行されるので、このコマンドの後のコマンドは次のようになります。
xargs -I{} echo {}
これは単にすべてのファイル名をエコーします。
find コマンドを使用できます。
find directory_name -name '*.py' \
-exec rename 's/.py/_2.py/' {} +
1 つのコマンドですべてのファイルの名前を変更できます。
サブディレクトリではなく現在のディレクトリでのみファイルを検索するには、maxdepth 1
次のオプションを使用します。
find directory_name -maxdepth 1 -name '*.py' \
-exec rename 's/.py/_2.py/' {} +