Como manipular vários nomes de arquivos usando find?

1

Como melhorar o comando abaixo para alterar uma string em um nome de arquivo.

find . -type f -name '*<today>*' -exec mv {} {}_renamed \;

Na verdade, tenho alguns arquivos no meu diretório com a data de hoje como parte do nome. Eu quero alterar os nomes de todos os arquivos de tal forma que apenas a seqüência de data no nome do arquivo será alterada para a data de ontem a partir da data de hoje.

Eu não quero colocar um sufixo ou prefixo no nome do arquivo, em vez de manipular o nome do arquivo.

por exemplo,
antes que o nome do arquivo de comando seja xxx20170821yyyy.ppp
após o nome do arquivo de comando será xxx20170820yyyy.ppp

e repita isso para todos os arquivos que possuem 20170821 string em seu nome.

    
por BreakBadSP 19.09.2017 / 12:46

1 resposta

3

Use rename como parte dos comandos Perl.

find . -type f -name '*20170919*' -execdir 
rename -n 's/20170919/20170918/' '{}' \;

Use execdir enquanto estiver executando seu comando part para ser executado para o arquivo localizado no caminho relativo em que execdir retorna. Isso evitará passar o caminho completo do arquivo (em relação ao diretório de trabalho atual) e evitar que uma pasta com o mesmo padrão esteja renomeando errado, em vez do próprio nome do arquivo.

Se todos os seus arquivos estiverem no diretório único, abaixo de um liner rename é suficiente.

rename -n 's/20170919/20170918/' *20170919*

Remove -n quando você confia no resultado da renomeação para ter renomeação real. Talvez seja necessário adicionar -v para ver o que está sendo renomeado.

No final, talvez seja necessário ter a data de hoje se quiser que isso seja feito todos os dias para vários arquivos. em seguida, use o comando date da seguinte forma em $(...) (substituição de comando) entre aspas duplas.

find . -type f -name "*$(date +"%Y%m%d")*" -execdir 
rename -n "s/$(date +"%Y%m%d")/$(date -d "-1day" +"%Y%m%d")/" '{}' \;

P.s, como você está usando csh shell, você precisa usar '...' em vez de $(...) , ou melhor alternar para novos shells como bash , zsh .

find ./ -type f -name "*'date +"%Y%m%d"'*" -execdir 
rename -n "s/'date +"%Y%m%d"'/'date -d "-1day" +"%Y%m%d"'/" '{}' \;
    
por 19.09.2017 / 12:49