Veja a opção --target-directory para mv .
Eu executei um comando de arquivo em todos os elementos no diretório do meu Desktop:
~/Desktop > file *
então eu usei todas as linhas que possuem a string "image" na descrição:
~/Desktop > file * | grep "image"
depois, cortei apenas o nome do arquivo de cada linha:
~/Desktop> file * | grep "image" | cut -d: -f1
A partir desta etapa, não sei como mover todos os nomes de arquivos obtidos para um diretório, tentei xargs, mas acho que entendi errado:
~/Desktop> file * | grep "image" | cut -d: -f1 | xargs mv {} ./dirk
Veja a opção --target-directory para mv .
{} não é significativo para xargs , a menos que você passe a opção -i com uso suspenso ou use -I {} .
file * | grep "image" | cut -d: -f1 | xargs -I {} mv {} ./dirk
Isso só funciona se os nomes dos arquivos não contiverem caracteres especiais ( :\"' ou newline ou um - ; espaços iniciais funcionam com xargs -I ). Isso também inclui nomes de arquivos que contêm images , mesmo que não sejam imagens. Isso inclui arquivos que o comando file descreve como “imagem”, como “imagem de disco”, não apenas imagens como nas imagens.
Uma maneira mais confiável (mas não perfeita) de filtrar arquivos cujo conteúdo é uma imagem é usar file -i e procurar por arquivos descritos como FILENAME: image/TYPE . O trecho abaixo também converte caracteres de citação que confundem algumas versões de xargs ¹.
file -i ./* |
sed -n -e 's/["'\''\]/\&/' -e 's/: *image\/[^:]*$//p' |
xargs -I {} mv {} ./dirk
Com versões razoavelmente recentes dos utilitários GNU (ou seja, sistema Linux não integrado ou Cygwin), você pode usar listas separadas por nulos para tornar o processamento confiável e um pouco mais rápido.
file -0i ./* |
sed -z -e 's/: *image\/[^:]*$//p' |
xargs -0 mv -t ./dirk
Outra abordagem, que tem o benefício de funcionar mesmo se file * falhar devido ao limite de comprimento da linha de comando, é usar um loop ou find para iterar os arquivos.
for x in ./*; do
if [ -n "$(file -i "$x" | sed -n '$/: *image\/[^:]*$/ p')" ]; then
mv "$x" ./dirk
fi
done
¹ POSIX diz que -I desabilita o processamento de cotações de xargs , mas este não é o caso na versão GNU a partir do findutils 4.4.2.