lsとエスケープ文字の助けが必要です。

lsとエスケープ文字の助けが必要です。

ファイル名にスペースが含まれているディレクトリ内のすべてのファイルに対して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組み込みコマンド

おすすめ記事