Eu tenho alguns arquivos de vídeo source/
para codificar e quero que a saída seja salva no diretório local, removendo, portanto, source/
o nome do arquivo.
Consegui isso usando o seguinte comando no shell de peixe:
$ for file in source/*.mkv
ffmpeg -i "$file" -c:v copy -c:a copy (echo "$file" | sed -e "s/source\///")
end
Embora eu ache a saída echo
um sed
pouco rudimentar, existe uma função que processa apenas as strings de variáveis locais? Como um sed
, mas apenas para variáveis locais ou nomes de arquivos.
Você está removendo um nome de diretório (fixo) da string aqui.
No shell padrão, você pode fazer isso com a
${parameter#pattern}
expansão , ela removepattern
do início da string emparameter
, então${file#source/}
removeria o prefixosource/
.Também em ksh/Bash/zsh
${parameter/pattern}
remove a correspondência em qualquer lugar na string, que correspondes/pattern//
mais de perto ao sed. (${..//..}
para remover todas as correspondências). Esses padrões são os mesmos usados para curingas de nome de arquivo ; eles não são regexes.Em
fish
, existe o comando builtinstring replace
, que parece que pode ser usado aqui:ou com
-r
for regex, então não precisamos saber o caminho:(Observe que não estou familiarizado com peixes. O procedimento acima pareceu funcionar, mas não tenho certeza se ele quebra em alguns casos de canto.)
Você está procurando
basename
: