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

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

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

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|'

答え2

IMOの名前変更、照会などは混乱して使用するのが難しいです。この種のものが使いやすいと思いますmvhttps://github.com/sharkdp/fdGNUと並行しています。

fd output.txt | parallel --dry-run mv {} {.}_modified.txt

parallel各入力行に対して入力したコマンドを実行します(この場合はfdパスのリストが表示されます)。{}「現在の入力」を意味します。{.}現在の入力を表しますが、拡張子は削除されます。--dry-run実行するコマンドのみが印刷され、parallel表示されません。最初に実行してから--dry-run満足している場合は実行する必要があります。

パッケージマネージャでfdとパラレルをインストールする必要があります。

関連情報