bashでzmvを呼び出す

bashでzmvを呼び出す

私は最近、次のようにファイル名を変更するこの手法を見つけました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大文字に変換したい場合)

おすすめ記事