GNU/Linux >> Linux の 問題 >  >> Linux

コマンドラインと Xargs でファイルの名前を一括変更する

これは 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 ループ内。


Linux
  1. findコマンドを使用してLinux上のファイルとディレクトリを検索します

  2. 名前を変更せずにファイルマネージャでファイルとフォルダを非表示にする方法

  3. 11 Linux diff3 コマンドの例 (3 つのファイルを 1 行ずつ比較)

  1. xclipを使用してLinuxコマンドラインでコピーして貼り付けます

  2. コマンドラインからアクセス許可と所有者を変更する方法

  3. Linuxでコマンドラインからファイルとディレクトリを削除する方法

  1. Linuxでコマンドラインからファイルを分割して結合する方法

  2. Metamorphose 2 –Linuxでファイルとフォルダーの名前をバッチで変更

  3. Linuxのコマンドラインを使用してファイルを作成する