exclui que o arquivo de redirecionamento de destino seja processado no loop for

2

Isso fará com que LIST fique muito grande (até mesmo alguns GB em pouco tempo, etc.):

$ for i in *; do echo $i; cut -d '   ' -f1 $i ; done > LIST

Por exemplo, após 10 segundos:

$ wc -l LIST
132654955 LIST
$ ls -hl LIST
-rw-r--r-- 1 user users 2.3G Jan 22 21:35 LIST

Acho que o motivo é que LIST é adicionado à lista de arquivos que deve ser processado e cut nunca termina de processá-lo. Eu encontrou 3 soluções para este problema:

  • exclua LIST do processamento:

    for i in !(LIST); do echo $i; cut -d '     ' -f1 $i ; done > LIST
    
  • use outro diretório para LIST :

    for i in *; do echo $i; cut -d '     ' -f1 $i ; done > /tmp/LIST
    
  • expanda * antes de executar o loop com C-x * ou o que for que $ bind -p | grep glob-expand-word mostre

O meu raciocínio está correto e qual é o melhor aqui?

    
por user1042840 22.01.2016 / 21:48

2 respostas

2

Seu raciocínio está correto.

Entre suas soluções propostas, eu prefiro as duas primeiras especialmente a segunda, já que parece mais fácil escrever em um arquivo localizado em outro diretório.

Aqui está outra opção usando GLOBIGNORE variable (dado que o seu shell suporta isso):

GLOBIGNORE=LIST  ## "LIST" file will be ignored while globbing
for i in *; do echo "$i"; cut -d '   ' -f1 "$i"; done >LIST
    
por 22.01.2016 / 22:03
2

Se você estiver realizando atividades em todos os arquivos em uma pasta e colocando o arquivo de saída na mesma pasta, não é uma abordagem inteligente na minha opinião. Meus redirecionamentos > output sempre acabam em /tmp , a menos que eu saiba que não há espaço suficiente para minha saída. Então eu procuro por um sistema de arquivos mais adequado para isso. Mas nunca coloque-os no mesmo diretório que eu estou processando os arquivos de entrada.

    
por 22.01.2016 / 22:04