Atribuir saída ls a uma variável fornece um comportamento inesperado

1

Eu estava escrevendo um script para limpar um arquivo de texto de um diretório (eu sei, é uma má ideia, mas eu realmente preciso disso) e eu escrevi isto:

#!/bin/bash
var=$(ls -p /direcotry/to/file | grep -v /)
truncate -s 0 $var

O problema é que, quando executo o script, todos os arquivos desse diretório são copiados para o diretório a partir do qual eu inicio o script e os arquivos do diretório original permanecem inalterados. Por que esse comportamento e como posso corrigi-lo?

    
por Azazel 16.05.2015 / 16:32

1 resposta

1

Isso ocorre porque a saída do comando ls é apenas a lista de nomes de arquivos, não o caminho deles. O comando truncate , portanto, recriará os mesmos nomes de arquivos que os arquivos vazios no diretório atual.

Além disso, sua abordagem, mesmo que seja feita corretamente, vai invadir nomes de arquivos um tanto estranhos (aqueles que contêm um espaço, por exemplo), sem falar de outros mais complexos (com novas linhas ou barras invertidas, etc.).

Primeiro de tudo, você não precisa fazer o script. Você poderia apenas passar a lista de arquivos para truncate :

truncate -s 0 /direcotry/to/*

Se truncate encontrar um diretório, ele apenas imprimirá um erro e passará para o próximo item:

truncate: cannot open ‘foo’ for writing: Is a directory

Para fazer isso de maneira mais clara, você pode usar find :

find /direcotry/to/file -type f -exec truncate -s {} +

Ou um shell glob:

for f in /direcotry/to/file; do
    [ -f "$f" ] && truncate -s "$f"
done
    
por 16.05.2015 / 18:57