Encontre + cole + ache: faça várias consultas para cada arquivo

0

Estou tentando obter para cada arquivo em um diretório, uma linha com pelo menos os seguintes campos (a ordem não importa, embora essa seja a preferível):

 - Image resolution, in case it is an image. If not, just blank.
 - Modification date
 - Human readable file size
 - Filename

Os arquivos no diretório são imagens jpg e o restante apenas arquivos de texto simples. Eu tentei com algo como:

find . -type f -exec paste 'identify {} 2> /dev/null' 'ls -goh {}' \;

ls diz para mim que cannot access {} . A parte 2> /dev/null dentro de identify é para pular mensagens de erro para arquivos não-jpg.

Eu também tentei com combinações diferentes de xargs e $() e assim por diante, mas ainda não encontrei um jeito.

Alguma sugestão?

    
por Peregring-lk 21.09.2018 / 19:41

2 respostas

1

Isso parece ser um bom uso para um script -exec incorporado:

find . -name \*.png -exec sh -c 'printf '%s,%s\\n' "$(identify -format '%hx%w' "$1")" "$(stat -c %y,%s,%n "$1")";' bash {} \; > out.csv

A saída da amostra é:

32x32,2018-09-21 15:04:33.216773000 -0400,192,./favicon.png
20x20,2018-09-21 15:04:33.225771000 -0400,1202,./delete.png

Desmembrado por legibilidade, esse script é:

find . -name \*.png -exec sh -c 
  'printf '%s,%s\\n' 
     "$(identify -format '%hx%w' "$1")" 
     "$(stat -c %y,%s,%n "$1")";' 
  bash {} \; > out.csv

Observe a cotação extra para obter um único \n em printf .

Fora de find , para obter essa saída para arquivos no diretório atual:

for f in ./*.png
do
  printf '%s,%s\n' "$(identify -format '%hx%w' "$f")" "$(stat -c %y,%s,%n "$f")"
done

A saída da amostra é:

20x20,2018-09-21 15:04:33.225771000 -0400,1202,./delete.png
32x32,2018-09-21 15:04:33.216773000 -0400,192,./favicon.png

Você pode alterar as peças ou adicionar outras peças conforme necessário; para o terceiro comando, basta adicionar outro comando %s e quoted.

Gerei uma saída do tipo CSV simplista, mas se seus nomes de arquivos puderem conter vírgulas, você deverá citar o nome do arquivo. Idem se você converter os tamanhos de arquivo de uma simples cadeia de bytes em uma com vírgulas nos milhares lugares.

    
por 21.09.2018 / 21:21
0

O texto nas suas substituições é avaliado uma vez antes mesmo de ser encontrado. Observe que a maneira preferida é agora $( ) . Você pode passar os comandos citados para um shell, mas a maneira mais fácil é simplesmente criar um script e chamar o script de find .

    
por 21.09.2018 / 19:46