Use saída do awk como entrada para mv

0

Estou tentando escrever um script (ou um one-liner) que encontre todos os arquivos de imagem com dimensões pequenas e, em seguida, mova-os para um diretório. Com base em esta resposta do Ask Ubuntu , consegui gerar uma lista de arquivos com ambas as dimensões abaixo de 500 e, em seguida, Consegui encontrar todos os arquivos de imagens comuns, bem como .jpg .

find -E . -regex ".*\.(jpg|gif|png|jpeg)" -type f -exec identify -format '%w %h %i\n' '{}' \; | awk '$1<500 && $2<500' | awk '{print $3}'

O segundo awk é para que ele imprima apenas o nome do arquivo, que eu esperava usar na entrada para mv . Como posso obter essa saída em mv ?

Exemplo de saída do primeiro awk é:

123 456 ./smallimage.jpg
333 333 ./square.png

O segundo awk apenas distribui

./smallimage.jpg
./square.png

No entanto, não consigo encontrar uma maneira de obter essa lista de nomes de arquivos como a entrada para um comando mv , pois o comando final resultante resultante é uma forma de mv <file list> ./small_images/

    
por cjm 10.01.2017 / 06:58

2 respostas

2

Incorpore mv em awk usando a função system() :

awk '$1<500 && $2<500 {system("mv "$3" /destination")}

Altere o comando mv para atender sua necessidade, aqui eu usei:

mv /file_(third_field)_from_awk /destination

Além disso, você não precisa de vários awk s, apenas um seria suficiente, conforme mostrado acima.

    
por 10.01.2017 / 07:01
1

Com a suposição de que você não está tendo nomes de arquivos com novas linhas incorporadas, você pode usar os programas GNU mv e xargs para fazer isso.

 ... | awk ... | xargs -d'\n' mv -t ./small_images

xargs coleta os nomes de arquivos da entrada e os anexa ao comando mv -t ./small_images , dividindo comandos muito longos conforme necessário. Você precisa de uma versão de mv que tenha a opção -t para especificar o diretório de destino no início do comando, ou então escrever um pequeno script para manipulá-lo.

    
por 10.01.2017 / 09:16