Estou tentando criar um script bash para executar o comando ffmpeg em todos os arquivos em um diretório com nomes de arquivos que contenham espaços. Este é o script com o qual comecei para fazer um arquivo individual que funcione corretamente. Eu uso tab
para preencher o argumento filename que inclui um caractere de escape para todos os espaços:
#!/bin/bash
input="./"$1
output="/xfer/transfer/temp/"$1
ffmpeg -i "${input}" -c:v copy -c:a libfdk_aac -b:a 160k "${output}"
O próximo passo é executar o comando ffmpeg em todos os arquivos de um diretório. Digamos que o diretório fique assim com o ls
comando:
'Name of First File.mkv'
'Name of Second File.mkv'
Aqui está meu código de teste:
#!/bin/bash
files=$(ls *)
for input in ${files}
do
echo $input
done
Meu problema é que a saída fica assim:
Name
of
First
File.mkv
Name
Of
Second
File.mkv
Adicionar a -b
ao comando ls simplesmente adiciona uma barra invertida ao final de cada linha. Preciso de ajuda para fazer $input
parecer Name of First File.mkv
, etc.
Conforme apontado nos comentários, cite suas expansões de parâmetros e não faça loop through
ls
output . Nomes de arquivos sem aspas podem ser divididos se contiverem algum dos caracteres naIFS
variável shell.O código a seguir pode resolver seu problema:
Tenha cuidado ao substituir o padrão no loop; ele pode se expandir para uma lista de nomes de caminhos com barras que seriam concatenadas com a string
/xfer/transfer/temp
. Para evitar isso, você pode fazer o seguinte:Se você precisar recorrer ainda mais ao diretório, defina a
globstar
opção com oshopt
comando builtin .