Aqui está uma resposta para a pergunta do bônus.
Na verdade, eu quero colocar a data de criação de uma foto em seu nome de arquivo, para obter algo como 20091231 2359 New Year.jpg. Receio precisar de uma combinação não trivial de comandos para conseguir isso?
Supondo que você queira tirar a data de criação da foto a partir dos dados EXIF, precisará de uma ferramenta separada para isso. Felizmente, isso jhead
oferece uma maneira trivial de fazer exatamente o que você deseja, com sua -n
opção.
$ jhead -h
[...]
-n[format-string]
Rename files according to date. Uses exif date if present, file
date otherwise. If the optional format-string is not supplied,
the format is mmdd-hhmmss. If a format-string is given, it is
is passed to the 'strftime' function for formatting
In addition to strftime format codes:
'%f' as part of the string will include the original file name
[...]
Aqui está um exemplo:
$ jhead -n%Y-%m-%d-%f New_year.jpg
New_year.jpg --> 2009-12-31-New_year.jpg
Edit : Claro, para fazer isso em várias fotos, seria algo como:
$ for i in *jpg; do jhead -n%Y-%m-%d-%f $i; done
Para ajustar a formatação da data ao seu gosto, dê uma olhada na saída de date --help
, por exemplo; listará os códigos de formato disponíveis.
(O jhead está amplamente disponível para diferentes sistemas. Se você está no Ubuntu ou Debian, digite simplesmente sudo apt-get install jhead
para instalá-lo.)
Apenas para a parte de renomeação, o programa 'renomear' funcionará. É o mesmo que o exemplo que você viu na página de manual, apenas mudou.
fonte
A chave é que, se você viu um exemplo que mostra como mover uma parte do nome do arquivo com uma expressão regular, esse é o único exemplo que você precisa. As extensões não têm status especial nos sistemas de arquivos unix - elas são apenas uma parte do nome do arquivo que está atrás de um
.
caractere.fonte
mv "$file" yourfile"${file#myfile}"
. Funciona em qualquer shell moderno tipo Bourne (ou qualquer shell POSIX), mas provavelmente não o shell Bourne real.Aqui estão mais algumas maneiras diferentes de manipular nomes de arquivos
As expansões de parâmetro no
mv
comando funcionam da seguinte maneira:${f%.*}
- Exclua o padrão de correspondência mais curto do final da string contida$f
, neste caso, exclua tudo depois e incluindo o último ponto. O single%
significa "o mais curto do final".${f##*.}
- Exclua o padrão de correspondência mais longo do início da string contida$f
, neste caso, tudo antes e incluindo o último ponto (isso inclui outros pontos também). O duplo#
(##
) significa "mais longo desde o início".Então, por exemplo, se
$f
contém "Foo.bar.baZ.jpg":dá
e
dá
Portanto, o
mv
comando, uma vez expandido, seria semelhante a:fonte
f%
ef##
é descrito aqui, por exemplo: tldp.org/LDP/abs/html/parameter-substitution.htmlNão há extensões de nome de arquivo no Linux.
Use expressões regulares para cortar substrings específicos do nome do arquivo e acessá-los.
Exemplo:
Cenário da vida real: você está extraindo html de um arquivo chm. Os nomes de arquivos no Windows não diferenciam maiúsculas de minúsculas; portanto, no Linux, você obterá links quebrados. Você tem um arquivo chamado index.HTML , mas href = "index.html" nos URLs. Portanto, seu objetivo é adaptar os nomes de arquivos para corresponder aos links para eles.
Suponha que você tenha o nome do arquivo em uma variável:
A partir da versão 3.0, o bash suporta expressões regulares, portanto você não precisa de ferramentas adicionais, como grep / sed / perl, etc. para executar a manipulação de strings. O exemplo a seguir ilustra a substituição de uma correspondência de backend em uma sequência:
As seqüências de correspondência e substituição podem ser parametrizadas, se você desejar, isso fornece flexibilidade adicional ao escrever um script. O seguinte snippet de código atinge o mesmo objetivo:
Consulte os documentos do bash para obter informações adicionais.
fonte
Aqui está outro:
fonte
Sempre há mais de uma maneira de fazer isso. Coloquei o seguinte script como / usr / local / bin / mrename.
Em seguida, no script que contém os arquivos de foto, digite: mrename
Há também um recurso opcional comentado no script para dimensionar as fotos (usando o ImageMagick).
Espero que isso seja útil para algumas pessoas.
fonte
Você pode usar a
-X/--keep-extension
opção comrename
(versão 1.600):-X, --keep-extension Save and remove the last extension from a filename, if there is any. The saved extension will be appended back to the filename at the end of the rest of the operations.
rename
está disponível para Mac a partir do Homebrew e para Linux a partir do Linuxbrew (entre outras opções de instalação, é claro).fonte