私は最近、次のようにファイル名を変更するこの手法を見つけましたzsh
。
autoload zmv
zmv '(*).JPG' '$1.jpg'
次のように書くこともできます。
autoload zmv; zmv '(*).JPG' '$1.jpg'
JPG
これは宣伝されたとおりに機能し、大文字の拡張子を小文字に変更するために使用できます。
しかし、通常のBASHシェルで1行のコードで実行したいと思います。次のように呼び出そうとすると、次のようになります。
zsh -c "autoload zmv; zmv -f '(*).JPG' '$1.jpg'"
または次のように:
echo 'autoload zmv; zmv -f "(*).JPG" "$1.jpg"' | zsh -i
次のようなメッセージを受け取りました。
zmv: error(s) in substitution:
….JPG and ….JPG both map to .jpg
これが私に意味するのは、zsh
ファイル名が大文字と小文字を区別せずに処理されることです。しかし、最初の方法を実行するときはそうではありません。
どうやら、私はここで何をしているのかわかりません。また、シェル拡張が邪魔になるのを防ぐために、一重引用符と二重引用符を逆にしてみました。
このコマンドをbashで1行のコマンドで実行するにはどうすればよいですか?
ベストアンサー1
存在する:
zsh -c "autoload zmv; zmv -f '(*).JPG' '$1.jpg'"
$1
二重引用符の間にあるため、bash
シェル()によって拡張され、空の文字列になる可能性が高いため、zsh
最終的には次のように解釈されます。
autoload zmv; zmv -f '(*).JPG' '.jpg'
使用:
zsh -c "autoload zmv && zmv '(*).JPG' '\$1.jpg'"
バックスラッシュはどこにありますか?引用符forは二重引用符内の特別な意味を$
削除します。bash
次のようにすることもできます。
zsh -c "autoload zmv && zmv '(*).(#i)jpg' '\$1.jpg'"
ここで大文字と小文字を(#i)
区別しない一致をオンにするので、、...ファイルの名前も.Jpg
変更します。.JPg
.jpG
関数として作成することもできます。
fix_ext_case() {
EXT=$1 zsh -c "autoload zmv && zmv \"(*).(#i)\$EXT\" '\$1.\$EXT'"
}
または、別の引用符の組み合わせを使用してください。
fix_ext_case() {
EXT=$1 zsh -c 'autoload zmv && zmv "(*).(#i)$EXT" "\$1.\$EXT"'
}
次のように使用されます。
fix_ext_case jpg
または
fix_ext_case png
(またはfix_ext_case JPG
大文字に変換したい場合)