Como ler múltiplos argumentos por linha para um comando bash?

1

Eu tenho um arquivo (ordered_names) que está no formato

pub 000.html
pub.19 001.html

por cerca de 300 linhas, e não consigo encontrar uma maneira de alimentar isso com o comando mv.

Eu li Fornecer strings armazenadas em um arquivo como uma lista de argumentos para um comando? , mas eu não conseguia o que eu vim para.

Aqui estão algumas das tentativas que fiz:

for line in "$(cat ../ordered_files.reversed)"; do mv  $(echo "$line"); done
for line in "$(cat ../ordered_files.reversed)"; do echo mv $(echo $line | cut -d' ' -f 1) $(echo $line | cut -d' ' -f 2) ; done
    
por Pierre Antoine Guillaume 16.12.2017 / 04:21

1 resposta

3

Tente:

while read -r file1 file2; do mv -n -- "$file1" "$file2"; done <inputfile

Isso pressupõe que os nomes dos arquivos em cada linha no arquivo de entrada são separados por espaços. Isso, obviamente, só funciona se os nomes dos arquivos não contiverem espaços. Se sim, então você precisa de um formato de entrada diferente.

Como funciona

  • while read -r file1 file2; do

    Isso inicia um loop while . O loop continua enquanto a entrada estiver disponível. Para cada linha de entrada, dois parâmetros são lidos: file1 e file2 .

  • mv -n -- "$file1" "$file2"

    Isso move file1 para file2 .

    A opção -n protege você de sobrescrever qualquer arquivo no destino. Claro, se for sua intenção sobrescrever arquivos, remova essa opção.

    A string -- sinaliza o final das opções. Isso protege você contra problemas caso qualquer um dos nomes de arquivos inicie com - .

  • done

    Isso sinaliza o fim do loop while .

  • <inputfile

    Isso informa ao loop while para obter sua entrada de um arquivo chamado inputfile .

por 16.12.2017 / 04:27

Tags