私は私の音楽ファイルを管理するBashスクリプトを書いていましたがmscript.sh
、そのいくつかはそのようなファイルのリストを生成しました。
all_exts=" -iname \"*.webm\" -o -iname \"*.mkv\" "
#all_exts=' -iname "*.webm" -o -iname "*.mp3" -o -iname "*.mp4" -o -iname "*.mkv" '
#The line below works fine
#find "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani" -maxdepth 1 -type f -size +1M \( -iname "*.webm" -o -iname "*.mp3" -o -iname "*.mp4" -o -iname "*.mkv" \)|\
find "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani" -maxdepth 1 -type f -size +1M \( "$all_exts" \)|\
awk -v FS="/" '{print $8}' > "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani/list"
#it does not work with single quotes either
次の出力が得られ、findコマンドをfind: paths must precede expression: -iname "*.webm" -o -iname "*.mkv" '
挿入せずにスクリプトを実行すると、スクリプトは正しく機能します。all_exts
正しくサイズを変更するにはどうすればよいですかall_exts
? PS:このスクリプトは問題を分離するための簡単なものです。all_exts
さまざまなディレクトリでこれを実行する検索コマンドが多いため、検索コマンドを挿入する必要があります。
答え1
これは変数を参照する必要があるため、単一の文字列を渡すためですfind
。set -x
$ all_exts=" -iname \"*.webm\" -o -iname \"*.mkv\" "
$ set -x
$ find . "$all_exts" > /dev/null
+ find . ' -iname "*.webm" -o -iname "*.mkv" '
残念ながら引用することはできません。まず、危険かもしれません。したがって、この習慣を持ち上げないことが最善です。 2番目に式を引用しないと、シェルはそれを分割して別々find
の引用文字列に渡すため、ここでは機能しません。
$ find . $all_exts
+ find . -iname '"*.webm"' -o -iname '"*.mkv"'
"foo.webm"
したがって、引用符がファイル名の一部であるファイルを探します。これらのパラメータを変数としてコマンドに渡す正しい方法は、配列を使用して引用符付き配列を次に渡すことですfind
。
$ all_exts=( '-iname' '*.webm' '-o' '-iname' '*.mkv' )
$ find . \( "${all_exts[@]}" \)
+ find . '(' -iname '*.webm' -o -iname '*.mkv' ')'
./foo.webm