次の名前のファイルを含む入れ子になったディレクトリを持つサブディレクトリがたくさんあります。
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 ';'
これは-T
GNU拡張です。これがなければ、名前付きディレクトリがすでに存在する場合は名前をにmv output.txt output_modified.txt
変更できますoutput.txt
。output_modified.txt/output.txt
output_modified.txt
rename
一度に複数のファイルの名前を変更できるため、ファイルごとに1つずつ呼び出すよりも効率的であるため、ここで役に立ちますが、mv
次のものが必要です。
到着
rename
あなたがPerlベースであることを確認してください、ゲームの馬鹿ではありませんutil-linux
。時にはfile-rename
またはprename
またはとも呼ばれますperl-rename
。次のように呼び出します。
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の名前変更、照会などは混乱して使用するのが難しいです。この種のものが使いやすいと思いますmv
。https://github.com/sharkdp/fdGNUと並行しています。
fd output.txt | parallel --dry-run mv {} {.}_modified.txt
parallel
各入力行に対して入力したコマンドを実行します(この場合はfd
パスのリストが表示されます)。{}
「現在の入力」を意味します。{.}
現在の入力を表しますが、拡張子は削除されます。--dry-run
実行するコマンドのみが印刷され、parallel
表示されません。最初に実行してから--dry-run
満足している場合は実行する必要があります。
パッケージマネージャでfdとパラレルをインストールする必要があります。