Ignora espaços no Loop durante a impressão do nome do arquivo?

3

Estou tentando obter arquivos com tamanho maior que 1k e com uma extensão txt meu código é o seguinte:

files=$(find foldername -size +1k -name \*.txt -exec {} \;)

for item in $files
do 
echo $item
done

Mas estou obtendo resultados inesperados, conforme indicado abaixo. Por favor ajude !!!

DEST/sample - Copy - Copy.txt: line 1: Hello: command not found
DEST/sample - Copy - Copy.txt: line 2: This: command not found
DEST/sample - Copy - Copy.txt: line 3: In: command not found
DEST/sample - Copy - Copy.txt: line 4: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 5: User: command not found
DEST/sample - Copy - Copy.txt: line 6: -s: command not found
DEST/sample - Copy - Copy.txt: line 7: -d: command not found
DEST/sample - Copy - Copy.txt: line 8: -t: command not found
DEST/sample - Copy - Copy.txt: line 9: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 10: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 11: Hello: command not found
DEST/sample - Copy - Copy.txt: line 12: This: command not found
DEST/sample - Copy - Copy.txt: line 13: In: command not found
DEST/sample - Copy - Copy.txt: line 14: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 15: User: command not found
DEST/sample - Copy - Copy.txt: line 16: -s: command not found
DEST/sample - Copy - Copy.txt: line 17: -d: command not found
DEST/sample - Copy - Copy.txt: line 18: -t: command not found
DEST/sample - Copy - Copy.txt: line 19: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 20: Hello: command not found
DEST/sample - Copy - Copy.txt: line 21: This: command not found
DEST/sample - Copy - Copy.txt: line 22: In: command not found
DEST/sample - Copy - Copy.txt: line 23: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 24: User: command not found
DEST/sample - Copy - Copy.txt: line 25: -s: command not found
DEST/sample - Copy - Copy.txt: line 26: -d: command not found
DEST/sample - Copy - Copy.txt: line 27: -t: command not found
DEST/sample - Copy.txt: line 1: Hello: command not found
DEST/sample - Copy.txt: line 2: This: command not found
DEST/sample - Copy.txt: line 3: In: command not found
DEST/sample - Copy.txt: line 4: $'\r': command not found
DEST/sample - Copy.txt: line 5: User: command not found
DEST/sample - Copy.txt: line 6: -s: command not found
DEST/sample - Copy.txt: line 7: -d: command not found
DEST/sample - Copy.txt: line 8: -t: command not found
DEST/sample - Copy.txt: line 9: $'\r': command not found
DEST/sample - Copy.txt: line 10: $'\r': command not found
DEST/sample - Copy.txt: line 11: Hello: command not found
DEST/sample - Copy.txt: line 12: This: command not found
DEST/sample - Copy.txt: line 13: In: command not found
DEST/sample - Copy.txt: line 14: $'\r': command not found
DEST/sample - Copy.txt: line 15: User: command not found
DEST/sample - Copy.txt: line 16: -s: command not found
DEST/sample - Copy.txt: line 17: -d: command not found
DEST/sample - Copy.txt: line 18: -t: command not found
DEST/sample - Copy.txt: line 19: $'\r': command not found
DEST/sample - Copy.txt: line 20: Hello: command not found
DEST/sample - Copy.txt: line 21: This: command not found
DEST/sample - Copy.txt: line 22: In: command not found
DEST/sample - Copy.txt: line 23: $'\r': command not found
DEST/sample - Copy.txt: line 24: User: command not found
DEST/sample - Copy.txt: line 25: -s: command not found
DEST/sample - Copy.txt: line 26: -d: command not found
DEST/sample - Copy.txt: line 27: -t: command not found
    
por BASEER HAIDER JAFRI 19.02.2016 / 02:44

3 respostas

0

Assumindo que -exec corresponde ao que você pretende fazer. (A opção -exec executa um arquivo não lido)

A solução simples para imprimir os nomes dos arquivos que correspondem às opções de localização é:

find foldername -size +1k -name \*.txt -print

Se você precisar que os nomes sejam atribuídos a uma variável, você precisa de mais. Para poder lidar com espaços em nomes de arquivos que resultam do comando find , a opção -print0 é a solução usual:

find foldername -size +1k -name \*.txt -print0

No entanto, para ser capaz de ler os resultados em uma variável bash, não é fácil.
Há uma longa explicação em esta excelente página wiki do Greg

#!/bin/bash
unset a
while IFS= read -r -d $'
find foldername -size +1k -name \*.txt -print
' file; do a+=( "$file" ) # or however you want to process each file done < <(find foldername -size +1k -name \*.txt -print0) printf 'filename=%s\n' "${a[@]}"
    
por 19.02.2016 / 22:39
1

O aparente problema: o comando find está fazendo um -exec {} , que tenta executar cada arquivo encontrado (a origem da maioria das mensagens de erro). Talvez você quisesse dizer apenas -print , por exemplo,

files=$(find foldername -size +1k -name \*.txt -print)

Você também terá problemas com a lista, se encontrar arquivos com espaços em branco em seus nomes - mas você verá que assim que encontrar os arquivos corretamente.

Existem várias maneiras de fazer isso; aqui está uma pequena alteração no seu script:

find foldername -size +1k -name \*.txt -print | \
while IFS= read -r item
do 
echo "$item"
done
    
por 19.02.2016 / 02:49
0

Com -exec {} \; , você está dizendo a find para executar cada um dos arquivos que encontrar como um comando. Parece que você quis imprimir os nomes dos arquivos, então diga: -print . Mas que quebra se o arquivo os nomes contêm espaço em branco . Geralmente, é uma má ideia analisar a saída de ls ou find ; faça isso apenas se tiver certeza absoluta de que é impossível que os nomes dos arquivos contenham espaços em branco ou outros caracteres especiais.

A maneira segura de agir com base nos resultados de find é fazer com que find acione a ação. Se você precisar usar algumas construções de shell (vários comandos, if , expansão de variável, pipes, etc.), invoque um shell. Passe o nome do arquivo como um argumento para esse shell.

find … -exec sh -c '
  echo "$0"
' {} \;

Você pode tornar isso mais rápido invocando um shell para um lote de arquivos, em vez de um para cada arquivo.

find … -exec sh -c '
  for item do
    echo "$item"
  done
' sh {} +
    
por 20.02.2016 / 02:18