繰り返しなしでxargsを使用して複数のファイル名を変更する

繰り返しなしでxargsを使用して複数のファイル名を変更する

ファイルを含むフォルダがあります。

a1.cpp
a2.cpp
a3.cpp
a4.cpp
a5.cpp
a6.cpp

2〜5の範囲のファイル拡張子を.javaに変更したいと思います。

ループを使用せずにxargsを使用してこれらのファイルの名前を変更するにはどうすればよいですか?

最終出力は次のとおりです。

a1.cpp
a2.java
a3.java
a4.java
a5.java
a6.cpp

答え1

いつものように filenames と一緒に使うxargs注意する必要がありますファイル名に重要な文字が含まれている場合。

つまり、GNUバージョンのfindsumxargs-print0sum-0オプションがあると仮定すると、次のことができます。

find . -type f -name 'a[2-5].cpp' -print0 | xargs -0 rename 's/cpp$/java/'

findこれは、要件に応じて関連ファイルのリストを生成し、スペースなどのファイル名を正しく処理できるようにNULLで終わる文字列として出力するために使用されます。次に、xargs適切なオプションを使用してスタイル名変換コマンドを提供できる-0(外部)ツールを呼び出します(@ilkkachuが指摘したように、util-linuxバリアントではなくPerlベースのツールを想定します)。renamesedrenameここ議論のため)。

これがusingの「有効な方法」と言えるかどうかはわかりませんが、あなたの意見によると、かなり堅牢な方法であるsの可能性をxargs探求したいと思います。xarg説明する操作は、次のようにコマンドをxargs完全に使用するのではなく、シェル構文機能を使用して完全に実行できます。rename

rename 's/cpp$/java/' a[2-5].cpp

renamePerlのバージョンはありませんが、util-linuxバリエーションがある場合、そのコマンドは次のようになります。

rename ".cpp" ".java" a[2-5].cpp

ただし、正規表現スタイルのアンカーがないため、このアンカーは置き換えられます。最初独創的なパターンと代替の出現。この場合、ファイルのサフィックスを変更する作業がありますが、.cpp名前の末尾に一度だけ発生するので問題にはなりませんが、一般的にコマンドを作成するときは注意が必要です。

関連情報