Sua função make_folder
é desnecessariamente complicada: todas essas mudanças no diretório atual estão tornando sua vida mais complicada. Além disso, você não precisa de sudo
: por que você criaria os diretórios como root? Apenas chame mkdir
.
mkdir documents other pictures media
Se você quiser que o script funcione mesmo que os diretórios já existam, use mkdir -p
:
mkdir -p documents other pictures media
Se você quiser usar find
, não imprima os nomes e, em seguida, analise-os. Faça com que find
execute o código desejado com -exec
. Para fazer mais do que invocar um programa simples, invoque um shell. Com <code>sh -c '<em>shell code</em>'
, o próximo argumento para sh
após o código shell está disponível no código shell como $0
. Sempre coloque aspas duplas em torno de variável substituições . No snippet de shell, a maneira natural de discriminar por extensão é com um caso construir no nome do arquivo. Eu uso a expansão de parâmetro construa ${0##*/}
para obter o nome base do arquivo (com tudo até a última barra removida). O teste [ -e "$destination_file" ]
testa se o arquivo de destino já existe, para evitar sobrescrever um arquivo com o mesmo nome que foi movido de um diretório diferente.
find random -exec sh -c '
case "$0" in
*.gif|*.png|*.jpg) destination_directory=pictures;;
…
*) destination_directory=other;;
esac
destination_file="$destination_directory/${0##*/}"
if [ -e "$destination_file" ]; then mv "$0" "$destination_file"; fi
' {} \;
Uma abordagem alternativa, que pode ser um pouco mais lenta se você tiver uma quantidade enorme de arquivos, mas é muito mais simples de escrever, é copiar o destino dos arquivos por destino. No Linux, graças aos utilitários GNU, é tão simples quanto
find random \( -name '*.gif' -o -name '*.png' -o -name '*.jpg' \) -exec mv -n -t pictures {} +
e da mesma forma para outros diretórios de destino. Usar +
em vez de ;
no final de find -exec
acelera um pouco invocando mv
em lotes.
Mas, no que você está fazendo, na verdade, em bash ou zsh, você não precisa de find
. Use o **
wildcard para percorrer o diretório recursivo.
shopt -s globstar # necessary in bash to enable **
mv -n random/**/*.gif random/**/*.png random/**/*.jpg pictures/
Observe que suponho que você queira colocar todos os arquivos diretamente sob os diretórios de destino. Se você quiser reproduzir a hierarquia de diretórios, isso é um assunto diferente e ferramentas diferentes seriam apropriadas.