Você pode fazer isso com relativa facilidade no bash:
for f in *jpg; do
type=$(file -0 -F" " "$f" | grep -aPo 'shopt -s globstar
for f in **/*jpg; do
type=$(file -0 -F" " "$f" | grep -aPo 'for f in *jpg; do
type=$(file -0 -F" " "$f" | grep -aPo 'shopt -s globstar
for f in **/*jpg; do
type=$(file -0 -F" " "$f" | grep -aPo '%pre%\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
Esta é a mesma idéia que a resposta do @ A.B, mas usando shell globs ao invés de find
. O ${f%%.*}
é o nome do arquivo sem sua extensão. O comando -0
do comando file
faz com que ele imprima
após o nome do arquivo que usamos em grep
${type,,}
do tipo de arquivo. Isso deve funcionar com nomes de arquivos arbitrários, incluindo aqueles que contêm espaços, novas linhas ou qualquer outra coisa. O PNG
é um truque para obter extensões de letras minúsculas. Ele converteria png
para shopt -s globstar
.
Você não disse em sua pergunta, mas se precisar que isso seja recursivo e desça em subdiretórios, você pode usar isso:
%pre% O **
ativará a opção globstar do bash, que permite que %code% corresponda a subdiretórios:
globstar
If set, the pattern ** used in a pathname expansion context will match all files and zero or more directories and subdirectories. If the pattern is followed by a /, only directories and subdirectories match.