Como invocar um arquivo de texto como uma lista de comandos

0

Problema: mais de 245.000 arquivos que residem em várias pastas recup_dir (saída de photo_rec run) precisam ser movidos para uma pasta centralizada para operações de recuperação adicionais. Todos os arquivos são arquivos * .jpg.

Eu tenho um arquivo de texto chamado newlist1.txt que eu tenho formatado nas 4 maneiras a seguir. E para mudar para cada variedade, um bom editor de localização / substituição é essencial. esses arquivos de script estão em uma pasta / discos / Keep / new-s1-recov. Eu sei, eu poderia ter usado apenas. para indicar onde mv os arquivos, mas inicialmente, os scripts estavam em outra pasta, e o período não teria sido suficiente.

  1. echo !(recov1/recup_dir.1033/f340010.jpg)| xargs mv -t /disks/Keep/new-s1-recov

  2. echo !recov1/recup_dir.1034/f3442050jpg| xargs mv -t /disks/Keep/new-s1-recov

  3. echo recov1/recup_dir.1034/f344208.jpg| xargs mv -t /disks/Keep/new-s1-recov

  4. ls recov1/recup_dir.1034/f344208.jpg| xargs mv -t /disks/Keep/new-s1-recov

os dois últimos exemplos, 3 & amp; 4, funcione corretamente quando executado a partir da linha de comando. Nenhum dos exemplos funciona quando eu digito

sh newlist1.txt

ou

bash newlist1.txt

O problema é que tenho mais de 245000 arquivos que precisam ser movidos. Por que não uso o gerenciador de arquivos e faço grupos de várias centenas de cada vez? Porque o gerenciador de arquivos é possivelmente o pior software no Ubuntu 16.04.3. Portanto, a linha de comando é a maneira preferível de realizar essa tarefa. Se eu passar vários dias tentando descobrir como fazer isso, considerarei o tempo bem gasto. Eu desperdicei mais do que isso no gerenciador de arquivos, esperando a tela sair de seu aparente torpor e finalmente mostrar que o movimento de vários arquivos finalmente foi realizado.

A formatação acima foi tirada de outros exemplos que encontrei em vários momentos. Tentei adaptar meu problema à solução de outra pessoa.

Então, a questão é: Como eu formato as linhas 245000 (usando o nano texteditor que tem um find / replace sem ter que adicionar algum software adicional ao gedit) e o coloco em um arquivo que pode ser invocado por qualquer comando que o Ubuntu não me dá "MUITOS ARGUMENTOS" e morre. Ele enviará cada linha como um comando e, quando estiver pronto, executará a próxima linha e assim por diante até que seja concluída.

    
por Hal Hackney 28.02.2018 / 01:14

1 resposta

0

Como 245.000 nomes de arquivos provavelmente não caberão em uma linha de comando, use find e xargs ( man find;man xargs ) e faça algo como:

find recov1/ -type f -iname '*.jpg' -print0 | \
    xargs -0 --no-run-if-empty mv -t /disks/Keep/new-s1-recov

Eu sempre uso find ... -print0 e xargs -0 no caso de nomes de arquivos conterem espaços em branco. Talvez seja necessário usar o xarg switches --max-args= ou --max-chars= if xargs falhar. Você também pode substituir mv por echo mv para testes.

    
por waltinator 28.02.2018 / 03:42