n=1; for file in $(find /media/foo/ -name '*.jpg'); do cp $file ~/Desktop/$n.jpg; n=$((n + 1)); done
Como posso usar os comandos do terminal / Linux para pesquisar recursivamente uma unidade por imagens (jpg) e copiá-las para a minha área de trabalho, renomeando todos os arquivos encontrados usando números. Portanto, a primeira vez que encontrar deve ser copiada para a área de trabalho como 1.jpg, o segundo arquivo deve ser copiado como 2.jpg e 50.000 arquivos devem ser copiados como 50000.jpg e assim por diante.
Existem dois problemas aqui.
Para o primeiro problema, a solução óbvia e correta é find
, o que, felizmente, torna isso muito fácil.
find / -type f -iregex '.*\.jpe?g$'
É claro que isso poderia ser mais sofisticado se você quisesse digite detecção com file
em vez de por extensão.
O segundo problema é a cópia sequencial. Um simples contador é tudo o que é necessário para que isso funcione.
n=1
cp "$source" "$dest/$n.jpeg"
n=$((n + 1 ))
Fazendo isso dentro de um loop, é claro, onde $source
muda em cada iteração.
Colocando tudo junto
#!/usr/bin/env bash
usage() {
echo "$0: usage: $0 [source directory] [destination directory]"
}
if [ ${#@} -ne 2 ] ; then
usage
exit
fi
scan="$1"
dest="$2"
if [ ! -d "$scan" ] ; then
usage
printf "\nspecified source does not exist or is not a directory\n"
exit
fi
if [ ! -d "$dest" ] ; then
usage
printf "\nspecified destination does not exist or is not a directory\n"
exit
fi
n=1
while read -r -d $'find / -type f -iregex '.*\.jpe?g$'
' source ; do
cp "$source" "$dest/$n.jpeg"
n=$((n + 1 ))
done < <(find "$scan" -type f -regextype posix-extended -iregex '.*\.jpe?g$' -print0)
Nota de portabilidade: -regextype
é uma extensão do GNU find; sem ele, -iregex
pode não corresponder a nomes de arquivos contendo novas linhas.