すべてのサブディレクトリで同じ名前のすべてのファイルの名前を別の名前に変更する方法

すべてのサブディレクトリで同じ名前のすべてのファイルの名前を別の名前に変更する方法

次の名前のファイルを含む入れ子になったディレクトリを持つサブディレクトリがたくさんあります。

output.txt

。これらすべてのファイルの名前を次のように変更したいと思います。

output_modified.txt

頑張った

find . -type f -name "output.txt" -execdir rename 's/output\.txt/output_modified\.txt/' '{}' \;

しかし、エラーが発生します。

rename: not enough arguments

私が逃した議論はありますか?それとも必要なことを行うより良い方法はありますか?

ベストアンサー1

必要ありませんrename。次のようにしてください。

find .  -name output.txt -type f -execdir mv -T output.txt output_modified.txt ';'

これは-TGNU拡張です。これがなければ、名前付きディレクトリがすでに存在する場合は名前をにmv output.txt output_modified.txt変更できますoutput.txtoutput_modified.txt/output.txtoutput_modified.txt

rename一度に複数のファイルの名前を変更できるため、ファイルごとに1つずつ呼び出すよりも効率的であるため、ここで役に立ちますが、mv次のものが必要です。

  1. 到着renameあなたがPerlベースであることを確認してください、ゲームの馬鹿ではありませんutil-linux。時にはfile-renameまたはprenameまたはとも呼ばれますperl-rename

  2. 次のように呼び出します。

    find . -name output.txt -type f -exec rename '
     s|\.txt\z|_modified.txt|' {} +
    

この{} +形式では、find複数の to が一度に渡されますrename

一部のPerlベースのバリアントでは、renameファイルのリストを使用して標準入力のNULL区切り文字の名前を変更することもできます。

find . -name output.txt -type f -print0 |
  rename -0 's|\.txt\z|_modified.txt|'

おすすめ記事