Qual é a boa maneira de adicionar a extensão de arquivo ".jpg" a arquivos sem extensão com o bash?
Qual é a boa maneira de adicionar a extensão de arquivo ".jpg" a arquivos sem extensão com o bash?
Respostas:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
"${f%.jpg}"
é a manipulação de strings do shell bash. `$ {string% substring}` Exclui a correspondência mais curta de $ substring atrás de $ string.
.jpg
até mesmo aos arquivos normais.
Você pode usar renomear:
rename 's/(.*)/$1.jpg/' *
rename from to file...
Outra maneira - sem loops
find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep 'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg
Demolir:
o comando acima é para simulação , depois disso você deve remover o "echo" antes de mv
EDITAR Algumas pessoas sugerindo que aqui é necessário "Quebrar argumentos de caminho entre aspas; evita divisão de argumento em caminhos com espaços" .
Normalmente, essa recomendação é verdadeira, neste caso não. Porque, aqui, o %
foi substituído não pela expansão do shell, mas peloxargs
internamente (diretamente), então o %
será substituído corretamente mesmo com espaços nos nomes de arquivos.
Demonstração simples:
$ mkdir xargstest
$ cd xargstest
# create two files with spaces in names
$ touch 'a b' 'c d'
$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths
#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext
$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...
Simples, faça cd para o diretório onde estão seus arquivos e:
for f in *;do mv $f $f.jpg;done
for f in *;do mv "$f" "$f".jpg;done
para suportar espaços em nomes de arquivos.
No meu caso, eu não conhecia o tipo de arquivo, então usei o comando mv com a ajuda do comando file para examinar e possivelmente encontrar o tipo de arquivo. Esta solução pode não ser perfeita para todos os arquivos, pois o comando file pode não reconhecer o tipo de arquivo, mas funcionou bem para mim.
for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done
O uso de awk é remover a segunda palavra da string retornada do arquivo de comando que é realmente a extensão.
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
--dry-run
e -a
não estão disponíveis na minha versão de rename
. Se for específico para alguma arquitetura, deve ser especificado.
Você pode mover vários arquivos . Eu sou um mantenedor deste projeto. A sintaxe é simples.
mmf files*
Ele irá abrir seu $ EDITOR com todos os nomes de arquivos, ou vim por padrão e você pode simplesmente destacar o final de todos os nomes de arquivo usando Ctrl + v + G no vim, salvar o arquivo, sair e para que todos os seus arquivos sejam renomeados
Ryan Li
A sintaxe correta para adicionar uma extensão de arquivo a vários arquivos dentro de um diretório que não tem uma extensão de arquivo é
find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then mv "$FILE" "$FILE".eml; fi; done;
mv "${file}" "${file}.jpg"
?