36

だから、私は次の構造を持っています:

.
..
a.png
b.png 
c.png

それらのサイズを変更するコマンドを実行しました

ls | xargs -I xx convert xx -resize xx.jpg

今私のディレクトリはこのように見えます

.
..
a.png.jpg
a.png
b.png.jpg
b.png
c.png.jpg
c.png

最初の質問は、ファイルの名前を変更して、拡張子を1つだけにする方法です。2つではありません。(基本的に、元の間違いをクリーンアップするにはどうすればよいですか)?

2番目の質問は、将来、xargsを使用して、ファイルの拡張子を2番目のコマンドと同じように変更するにはどうすればよいですか?

4

10 に答える 10

73

これは、ファイル拡張子を変更することでも実行できxargsますsed

ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv

元のファイル名を、希望するファイル名と一緒に印刷できます。次に、xargsにmoveコマンドでこれらの2つの引数を使用させます。ワンライナーの場合、*。pngファイル以外のものをフィルターで除外するgrepも追加しました。

于 2013-10-15T14:50:41.840 に答える
24

ファイルの名前を変更して、拡張子を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

変換するサブディレクトリにファイルがある場合はfindwhile readループにパイプできます。

find . -type f -name '*.png' |
while read file; do
  convert "$file" -resize "${file%.png}.jpg"
done

注:シェルスクリプトでの出力を使用することは、一般的に悪い考えと見なされます。lsあなたの例はうまくいったかもしれませんが、うまくいかない例はたくさんあります。たとえば、ファイル名に改行が含まれている場合(UNIXでは許可されています)、lsおそらく改行はエスケープされません。(これは実際には実装によって異なります。これはls、スクリプトで使用しないもう1つの理由です。動作はボックスごとに大きく異なります。)findwhile-readループまたはファイルグロブで(例*.png)forループ内。

于 2012-06-10T20:16:28.950 に答える
17

パーティーに遅れて来ますが、xargsを使用してファイルの名前を変更する方法は次のとおりです。fileN.svg.pngという名前のファイルがたくさんあり、それらにfileN.pngという名前を付けたいとします。ここで、Nは一連の整数です。

ls *.svg.png | xargs basename -s .svg.png | xargs -I {} mv {}.svg.png {}.png

最初のxargsは、basenameを使用して.svgと.pngの両方を取り除き、ちょうど.svgを取得しfilenameNます。2番目のxargsはその裸の名前を受け取り、replacementを使用してファイルの名前を変更します。

于 2015-05-09T06:20:41.873 に答える
6

エラーをクリーンアップするには、renameユーティリティを試してください。詳細については、マンページを確認してください。

あなたの場合、rename '.png.jpg' '.jpg' ./*あなたの現在のディレクトリが適切に設定されていればそうするでしょう。

あなたがconvert利用できるので、私はあなたも持っていると思いますmogrifyimagemagickスイート)。これを実行したいときはいつでも、ファイルを別のディレクトリにコピーして、mogrify代わりに使用します。通常、これはサイズ変更のためにのみ必要ですが、画像形式も変更するmogrifyと、ファイル名が処理されます(適切なファイル名で新しいファイルを作成します)。

として使用しますmogrify -format jpg -resize [size] ./*.png-resizeジオメトリ引数なしで何ができるのかわかりません。文書化されておらず、私のマシンでは機能しません。

Tim Poteが推論したように、xargsにファイル名と拡張子を別々に処理させることはできないと思います。

于 2012-06-10T21:05:13.297 に答える
5

私はこのパーティーに約3年遅れていますが、私は自分で理解したのと同じような問題を抱えていました。ImageMagickのsvgサポートが不十分なため、inkscapeを使用して変換したpngファイルのリストがありました。

私はもともと次のようにしてそれらを変換しました:

find . -name "*.svg" -exec inkscape {} --export-png={}.png

もちろん、これは上記のように同じ問題を引き起こしました。

file1.svg
file1.svg.png
file2.svg
file2.svg.png
file3.svg
file3.svg.png
file4.svg
file4.svg.png

*.svg.pngの名前を*.pngに変更したかったのですが、これが最終的な結果です...

find . -name "*.svg.png" -print0 | sed 's/.svg.png//g' | xargs -0 -I namePrefix mv namePrefix.svg.png namePrefix.png

これは3つのことを行います:

  1. * .svg.pngという名前のこのディレクトリファイルで、-print0が標準出力に出力されます。
  2. sedは標準出力を変更し、基本的に.svg.pngを何も置き換えないので、次のようになります:file1 / file2 / file3 / file4
  3. xargs -0はsedからデータを取得し、-Iは拡張子なしのファイル名を参照し、次にmvの元のファイル名を新しいファイル名に参照します。namePrefixという単語は特別なものではなく、明確にするためだけのものです。

編集

私は今、これがこれを行うための最も複雑な方法であることに気づきました。単にrenameコマンドを使用できます。

rename 's/svg\.png/.png/' *
于 2015-01-05T18:24:37.773 に答える
3

同様のタスクについて調査した後、ここに私のコードがあります:

find . -maxdepth 1 -name '*.png' -print0 | sed 's/.png//g' | xargs -0 -I% -n 1 -P 8 convert -quality 100 %.png %.jpg

理由:

  • 名前を変更してもファイルは圧縮されません(convert代わりにを使用してくださいmv
  • ls \.png$ | xargsパス/ファイル名のスペースは処理されません
  • find .サブフォルダを検索するので、-maxdepth 1
  • convert利用可能なCPUを使用しないので-P8(または-P other
  • sed最後になし'g'では、すべてのファイルが置き換えられるわけではありません(1つのみ)
  • sed 's/.png//g'拡張子は残されません(basenameも機能する可能性がありますが、その後は機能しませんでした-print0
  • parallel-潜在的に優れたソリューションですが、Ubuntu 18.04bash4.4では機能しませんでした
  • %置換の最小公倍数記号です(と比較してください{} xx namePrefix
  • -n2パラメータは適切ですが、正しく機能xargsしませんでした(取得して渡すエントリの数)-print0nxargs
  • -quality 100デフォルトの魔法の品質は92(これは問題ありません)です。ここでは、何かを失うことを避けるために100%です。
于 2019-03-06T01:54:39.673 に答える
1

私のソリューションは多くのxargソリューションに似ており、特にSchleisに似ています。

ここでの違いは、一致参照を使用した完全な正規表現操作と、一致しないファイルを適切に無視するsedコマンドであるため、リストを事前にフィルタリングする必要はありません。

これは、スペースとシェルメタを含むファイルに対しても安全です。

\2置換を任意の拡張子に変更します。

ls |
sed -nE 's/Rick\.and\.Morty\.(S03E[0-9]{2})\..*(\.[a-z0-9]{3})/"&" "Rick and Morty \1\2"/;T;p' |
xargs -n 2 mv

説明

argは-n、デフォルトでは何も出力しないように指示します。コマンドは、前のコマンドが置換を行わなかったT場合はスクリプトの最後にスキップすると言い、コマンドはパターンスペースを出力します(コマンドが一致する場合にのみヒットします)。sps

置換内の&は、一致する元のファイル名の内容への参照です。

mvコマンドをbash -c 'echo "run($#) $@"' bashthenに置き換えるmvと、呼び出される回数と、パラメーターの数と値を確認できます。

$ ls |
  sed -nE 's/Rick\.and\.Morty\.(S03E[0-9]{2})\..*(\.[a-z0-9]{3})/"&" "Rick and Morty \1\2"/;T;p' |
  xargs -n 2 bash -c 'echo "run($#) $@"' bash
run(2) Rick.and.Morty.S03E02.720p.HDTV.x264-BATV.mkv Rick and Morty S03E02.mkv
run(2) Rick.and.Morty.S03E03.720p.HDTV.x264-BATV.mkv Rick and Morty S03E03.mkv
run(2) Rick.and.Morty.S03E04.720p.HDTV.x264-BATV.mkv Rick and Morty S03E04.mkv
run(2) Rick.and.Morty.S03E05.HDTV.x264-BATV[ettv].mkv Rick and Morty S03E05.mkv
run(2) Rick.and.Morty.S03E06.720p.HDTV.x264-BATV.mkv Rick and Morty S03E06.mkv
run(2) Rick.and.Morty.S03E06.HDTV.x264-BATV.mkv Rick and Morty S03E06.mkv
run(2) Rick.and.Morty.S03E07.720p.HDTV.x264-BATV[ettv].mkv Rick and Morty S03E07.mkv
run(2) Rick.and.Morty.S03E08.720p.HDTV.x264-BATV.mkv Rick and Morty S03E08.mkv
run(2) Rick.and.Morty.S03E09.720p.HDTV.x264-BATV.mkv Rick and Morty S03E09.mkv
run(2) Rick.and.Morty.S03E10.720p.HDTV.x264-BATV.mkv Rick and Morty S03E10.mkv
于 2018-02-17T19:58:43.057 に答える
1

私の試み:https ://www.tecmint.com/linux-image-conversion-tools/

ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.png}.jpg"'

並列を使用する

parallel convert '{}' '{.}.jpg' ::: *.png
于 2019-01-10T17:32:06.630 に答える
0

初めてお答えするときは、悪くないことを願っています。

私はある種の同じ問題を抱えていました、私はシュライスの 答えエイドリアンのコメントを組み合わせてそれをなんとか解決することができました。問題は、ext4で許可されているスペース文字またはその他の特別なファイルを含むいくつかのファイルにありました。
これにより、任意のUTF8ファイル名を処理する機能が追加されます。はい、これ:

find . -type f -iname \*.png.jpg -print0 | sed -z 'p;s/\.png\.jpg/\.jpg/' | xargs -0 -n2 mv

私は過去にsed(またはxarg?)がヌル文字を処理するのに問題があったことを読みました(どこを思い出せません)。もはやそうではないようです。

私のように、答えをコピーするだけでなく、彼らが何をしているのかを理解したい人のために、以下にいくつかの説明を追加しました。;-)

コマンドパラメータ:

探す 。:現在のディレクトリで検索
-type f:通常のファイルであるもの(例:デバイス、ディレクトリなどではない)
-iname:ファイル名に基づいて検索しますが、大文字と小文字は区別されません。画像ソフトウェアが「png」の代わりに「PNG」を書き込む場合に備えて
-print0:NULL文字で検出されたものを区切ります

sed -z:null文字を、処理するテキストのさまざまな要素の唯一の区切り文字と見なします。受信したテキストと変更されたテキストの両方
p:最初に受信した行を書き込みます
s / .png.jpg / .jpg /:.png.jpgを.jpgに置き換えて書き込みます

xargs -0:入力項目は他のものではなくヌル文字で終了します
-n2:sedから受け取った2つの引数をmvに送信します

各コマンドの機能:

探す :

file1.png.jpgNULLfile2.png.jpgNULLfile3.png.jpgNULLfile4.png.jpg

sed

file1.png.jpgNULLfile1.jpgNULLfile2.png.jpgNULLfile2.jpgNULLfile3.png.jpgNULLfile3.jpgNULLfile4.png.jpgNULLfile4.jpg

xargs

mv file1.png file1.jpg  
mv file2.png file2.jpg  
mv file3.png file3.jpg  
mv file4.png file4.jpg  
于 2022-02-23T05:34:11.040 に答える
-1

find ./xx -name "*.png" -print0 |sed 's/.png$//g'|xargs -0 -I% mv %.png %.jpg

次のコマンドを使用するのが好きです

find ./xx -name "*.png" -type f|while read FILE; do
  mv "$FILE" "$(echo $FILE|sed -e 's/.png$/.jpg/')";
done
于 2018-12-08T07:51:22.937 に答える