ファイルを含むフォルダがあります。
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バージョンのfind
sumxargs
と-print0
sum-0
オプションがあると仮定すると、次のことができます。
find . -type f -name 'a[2-5].cpp' -print0 | xargs -0 rename 's/cpp$/java/'
find
これは、要件に応じて関連ファイルのリストを生成し、スペースなどのファイル名を正しく処理できるようにNULLで終わる文字列として出力するために使用されます。次に、xargs
適切なオプションを使用してスタイル名変換コマンドを提供できる-0
(外部)ツールを呼び出します(@ilkkachuが指摘したように、util-linuxバリアントではなくPerlベースのツールを想定します)。rename
sed
rename
ここ議論のため)。
これがusingの「有効な方法」と言えるかどうかはわかりませんが、あなたの意見によると、かなり堅牢な方法であるsの可能性をxargs
探求したいと思います。xarg
説明する操作は、次のようにコマンドをxargs
完全に使用するのではなく、シェル構文機能を使用して完全に実行できます。rename
rename 's/cpp$/java/' a[2-5].cpp
rename
Perlのバージョンはありませんが、util-linux
バリエーションがある場合、そのコマンドは次のようになります。
rename ".cpp" ".java" a[2-5].cpp
ただし、正規表現スタイルのアンカーがないため、このアンカーは置き換えられます。最初独創的なパターンと代替の出現。この場合、ファイルのサフィックスを変更する作業がありますが、.cpp
名前の末尾に一度だけ発生するので問題にはなりませんが、一般的にコマンドを作成するときは注意が必要です。