ファイル名にスペースが含まれているディレクトリ内のすべてのファイルに対してffmpegコマンドを実行するbashスクリプトを作成しようとしています。以下は、うまく機能する単一のファイルの作成を開始するスクリプトです。tab
すべてのスペースを含むファイル名パラメータを埋めるために使用するエスケープ文字は次のとおりです。
#!/bin/bash
input="./"$1
output="/xfer/transfer/temp/"$1
ffmpeg -i "${input}" -c:v copy -c:a libfdk_aac -b:a 160k "${output}"
次のステップは、ディレクトリ内のすべてのファイルに対してffmpegコマンドを実行することです。ディレクトリが次のようになり、コマンドが次のと仮定しますls
。
'Name of First File.mkv'
'Name of Second File.mkv'
これは私のテストコードです。
#!/bin/bash
files=$(ls *)
for input in ${files}
do
echo $input
done
私の問題は、出力が次のようになることです。
Name
of
First
File.mkv
Name
Of
Second
File.mkv
ls コマンドに a を追加すると、-b
各行の末尾にバックスラッシュが追加されます。など$input
のように見えるようにするのに助けが必要です。Name of First File.mkv
答え1
コメントで指摘したように、パラメータ拡張を引用し、ls
出力を繰り返さないでください。引用符のないファイル名は、IFS
シェル変数に文字が含まれている場合に分割できます。
次のコードで問題を解決できます。
for file in *; do
ffmpeg -i "${file}" -c:v copy -c:a libfdk_aac -b:a 160k "/xfer/transfer/temp/${file}"
done
ループでパターンを変更するときは注意してください。スラッシュを含むパス名のリストに展開でき、文字列に関連付けることができます/xfer/transfer/temp
。これを防ぐには、次のようにします。
for file in otherdirectory/*; do
ffmpeg -i "${file}" -c:v copy -c:a libfdk_aac -b:a 160k "/xfer/transfer/temp/$(basename "${file}")"
done
ディレクトリをより深く再帰する必要がある場合は、globstar
次のようにオプションを設定します。shopt
組み込みコマンド。