これは xargs
で行うこともできます と sed
ファイル拡張子を変更します。
ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
元のファイル名と、希望するファイル名を一緒に印刷できます。次に、move コマンドで xargs にこれら 2 つの引数を使用させます。ワンライナーについては、grep を追加して、*.png ファイル以外のものを除外しました。
<ブロック引用>
拡張子が 1 つだけになるようにファイルの名前を変更するにはどうすればよいですか。
cd dir/with/messedup/files
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
<ブロック引用> 今後、xargs を使用して、2 番目のコマンドに似たファイルの拡張子を変更するにはどうすればよいですか?
私の知る限り、それはできません。これを行う最善の方法は、上記のようなパラメーター置換を伴う for ループを使用することです:
for file in *.png; do
convert "$file" -resize "${file%.png}.jpg"
done
変換したいサブディレクトリにファイルがある場合は、 find
をパイプできます while read
に ループ:
find . -type f -name '*.png' |
while read file; do
convert "$file" -resize "${file%.png}.jpg"
done
注: ls
の出力を使用することは一般的に悪い考えと考えられています。 シェルスクリプトで。あなたの例はうまくいったかもしれませんが、うまくいかない例がたくさんあります。たとえば、ファイル名にたまたま改行が含まれていた場合 (UNIX では許可されています)、ls
おそらくあなたのためにそれらを逃れることはありません。 (これは実際には実装に依存します。これが ls
を使用しないもう 1 つの理由です) スクリプトで。その動作はボックスごとに大きく異なります。) find
を使用すると、より一貫した結果が得られます。 while-read ループまたはファイル グロビング (例:*.png
) for ループ内。