だから、私は次の構造を持っています:
.
..
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番目のコマンドに似せて変更するにはどうすればよいですか?
ファイルの名前を変更して、拡張子を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ループで。
これは、xargs
およびsed
を使用してファイル拡張子を変更することもできます。
ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
元のファイル名と、希望するファイル名を印刷できます。次に、xargsにmoveコマンドでこれらの2つの引数を使用させます。ワンライナーの場合は、*。pngファイル以外のものを除外するgrepも追加しました。
パーティーには遅れますが、xargsを使用してファイルの名前を変更する方法は次のとおりです。 fileN.svg.pngという名前の一連のファイルがあり、それらにfileN.pngという名前を付けたいとします。ここで、Nは一連の整数です。
ls *.svg.png | xargs basename -s .svg.png | xargs -I {} mv {}.svg.png {}.png
最初のxargsはbasenameを使用して両方の.svg and .pngを取り除き、_filenameN
だけを取得します。 2番目のxargsはその裸の名前を受け取り、置換を使用してファイルの名前を変更します。
エラーをクリーンアップするには、rename
ユーティリティを試してください。詳細については、マンページを確認してください。
あなたの場合、現在のディレクトリが適切に設定されていれば、rename '.png.jpg' '.jpg' ./*
を実行できます。
利用可能なconvert
があるので、mogrify
(imagemagick
suite)もあると思います。これを行う場合はいつでも、ファイルを別のディレクトリにコピーし、代わりにmogrify
を使用します。通常、これはサイズ変更にのみ必要ですが、画像形式も変更すると、mogrify
がファイル名を処理します(適切なファイル名で新しいファイルを作成します)。
mogrify -format jpg -resize [size] ./*.png
として使用します。ジオメトリ引数なしで-resize
が何をすることになっているかわからない。それは文書化されておらず、私のマシンでは動作しません。
Tim Poteが推論したように、xargsにファイル名と拡張子を個別に処理させることはできないと思います。
私はこのパーティーに約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つのことを行います。
[〜#〜]編集[〜#〜]
今、これが最も複雑な方法です。 renameコマンドを使用するだけです。
rename 's/svg\.png/.png/' *
同様のタスクのいくつかの調査の後、ここに私のコードがあります:
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.04 bash 4.4では機能しませんでした%
は、置換の最小共通シンボルです({} xx namePrefix
と比較してください)-n2
パラメータはxargs
には適していますが、-print0
では適切に機能しませんでした(n
xargs
の後に取得して渡すエントリ数)-quality 100
デフォルトの魔法の品質は92(これは問題ありません)で、何も失われないようにここでは100%です。私のソリューションは多くの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
_
_-n
_ argはデフォルトでは何も印刷しないように指示します。T
コマンドは、前のs
コマンドが置き換えを行わなかった場合、スクリプトの最後にスキップするように指示します。 p
コマンドはパターンスペースを出力します(s
コマンドが一致する場合のみヒットします)。
置換の_&
_は、元のファイル名の一致の内容への参照です。
コマンドのmv
をbash -c 'echo "run($#) $@"' bash
に置き換えると、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
_
私の試み: 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