O seguinte oneliner deve fazer o trabalho:
find . -maxdepth 1 -type f -name '*.jpg' -exec perl -e '$a="{}"; $a =~ /(\w+)/; 'mkdir -p && mv "$a" '' \;
Explicação
-
find . -maxdepth 1 -type f -name '*.jpg'
procurará arquivos (-type f
) somente na pasta atual (. -maxdepth 1
) com a extensão jpg. -
-exec
chamará o comandoperl
para todos os arquivos correspondentes. A string{}
é substituída pelo nome do arquivo atual que está sendo processado. -
$a="{}";
salva o arquivo atual -
$a =~ /(\w+)/
é um teste de expressão regular, a variável especialconterá a primeira palavra do nome do arquivo armazenado em
$a
. -
finalmente
mkdir -p && mv "$a"
é executado como um comando do sistema com/bin/sh
ou seu equivalente. Observe a opção-p
demkdir
, não falhará se o diretório já existir.
Atualizar
Para evitar a injeção de código no perl (obrigado @ geirha ), use o quotemeta funcionam da seguinte forma:
find . -maxdepth 1 -type f -name '*.jpg' -exec perl -e '$a="\Q@ARGV"; $a =~ /(\w+)/; 'mkdir -p && mv $a '' "{}" \;