Ajuda com script sobre uma lista de arquivos

3

Estou usando o seguinte comando

 mkvmerge -o  newfile.mkv  1.mkv  +2.mkv  +3.mkv   +4.mkv  etc...

este comando agrupa os arquivos de vídeo na lista. Normalmente eu tenho esses arquivos em uma pasta, o número de arquivos pode mudar (nem sempre 4, como no exemplo). Eu gostaria de receber um comando que:

  1. pegue a lista de arquivos mkv no diretório fornecido
  2. execute o comando acima.

Basicamente eu sei como obter a lista, por exemplo. FileList = $ (ls * mkv)), mas não sei como obter o "+" na frente dos nomes dos arquivos, incluindo o primeiro da lista.

Alguém pode ajudar com isso?

Cumprimentos Pierre

    
por Pierre 06.02.2015 / 14:17

3 respostas

3

LIST=''
for i in *.mkv; do
    if [ -n "$LIST" ]; then LIST="$LIST +"; fi
    LIST="$LIST$i"
done

mkvmerge -o newfile.mkv $LIST

Teste se a lista está vazia; Caso contrário, você precisará adicionar um espaço e + . Em seguida, execute o comando com a lista gerada.

    
por 06.02.2015 / 15:10
1

com bash

shopt -s nullglob
shopt -s extglob
first_file=1.mkv
add_files=(!(${first_file%.mkv}).mkv)
printf "%s\n" "${first_file}" "${add_files[@]/#/+}"
1.mkv
+2.mkv
+3.mkv
+4.mkv
mkvmerge -o newfile.mkv "${first_file}" "${add_files[@]/#/+}"
    
por 06.02.2015 / 15:39
1

Este método não usa um loop.
Além disso, para permitir caracteres não imprimíveis incorporados (por exemplo, espaço), ls -Q cita o nome do arquivo

eval "$(ls -Q1 *.mkv | sed '1s/^/mkvmerge -o newfile.mkv /; 1!s/^/ +/' | tr -d '\n')"

Observe que tr atua no nível de byte e, como tal, excluirá \ x0D (caractere de nova linha) incorporado em caracteres de nome de arquivo não ascii.

    
por 06.02.2015 / 21:51