複数の mkv ファイルに字幕を追加しようとしています。これを行うには、次のスクリプトを使用します。
for file in *.mkv; do "/Applications/Mkvtoolnix-7.0.0.app/Contents/MacOS/mkvmerge" -o "${file%\.*}(1).mkv" "(" "$file" ")" "(" "${file%\.*}.srt" ")" ; rm $file
ルート ディレクトリに対してのみ正常に動作します。ただし、サブフォルダー内のすべてのファイルに対しては動作しません。サブフォルダー内のすべてのファイルに対して動作するようにする方法を教えてください。
答え1
次のようなことができます:
# make bash function to do conversion and deletion
conv() {
/Applications/Mkvtoolnix-7.0.0.app/Contents/MacOS/mkvmerge -o "${1%\.*}(1).mkv" "(" "$1" ")" "(" "${1%\.*}.srt" ")"
rm "${1}"
}
# make conv function available to xargs
export -f conv
# recursively convert every .mkv file in current directory
find . -name "*.mkv" -type f -print0 | xargs -0 -n1 -I% bash -c 'conv "$@"' _ %
答え2
を使用している場合はbash
、
shopt -s グロブスター **/*.mkv 内のファイルの場合 する (MKVmerge などのコマンド) 終わり
globstar
シェル オプションを設定すると、すべてのディレクトリとサブディレクトリbash
を展開するように指示されます。**/
PS 常にすべてのシェル変数参照を引用符で囲んでください (引用符で囲まない十分な理由があり、自分が何をしているのかわかっている場合を除く)。特に、rm "$file"
の代わりにとしてくださいrm $file
。