Movendo arquivos recursivamente se determinada condição for atendida

2

Eu tenho a seguinte árvore de diretórios:

records/13/2014.12.16/00/05.mpg
records/13/2014.12.16/00/15.mpg
records/13/2014.12.16/01/05.mpg
records/13/2014.12.16/02/15.mpg
records/15/2014.12.14/05/25.mpg
etc.

Eu preciso renomear todos os arquivos que possuem *5.mpg em seu nome para *0.mpg . Então, por exemplo:

mv records/13/2014.12.16/00/05.mpg records/13/2014.12.16/00/00.mpg
mv records/13/2014.12.16/00/15.mpg records/13/2014.12.16/00/10.mpg
mv records/15/2014.12.14/05/25.mpg records/15/2014.12.14/05/20.mpg
etc.

Eu sei que vou ter que escrever um script bash para fazer isso. Infelizmente eu não sou bom nisso, é por isso que estou pedindo ajuda. Eu acho que ele terá que entrar em cada diretório (a parte recursiva) e mover todos os arquivos nesse diretório se o nome contiver *5.mpg .

    
por user3125731 16.12.2014 / 15:11

3 respostas

1

Basta percorrer todos os arquivos *.5mpg e usar a ajuda da expansão de parâmetro para alterar nomes de arquivos:

for file in *5.mpg; do mv -- "$file" "${file%5.mpg}"0.mpg; done

Para fazer isso para diretórios diferentes, configure a opção globstar ( shopt -s globstar no bash) e, adicionalmente, use o componente path com o comando dirname ou novamente usando a expansão de parâmetro.

    
por 16.12.2014 / 15:24
1

Outra solução:

find records -type f -iname '*.mpg' | xargs rename 5.mpg 0.mpg

Como todos os arquivos que você deseja renomear terminam com * 5.mpg, essa combinação find + rename funcionará muito bem para você.

    
por 16.12.2014 / 15:53
0

Na verdade, tentei escrever meu próprio roteiro. Parece funcionar:

#!/bin/bash

find . -type f -iname "*5.mpg" -print0 | while IFS= read -r -d $'
#!/bin/bash

find . -type f -iname "*5.mpg" -print0 | while IFS= read -r -d $'%pre%' line; do
   new=${line//5.mpg}
   zero="0.mpg"
   buffer=$new$zero
   new=$buffer
   mv $line $new
   echo "Moving $line"
done
' line; do new=${line//5.mpg} zero="0.mpg" buffer=$new$zero new=$buffer mv $line $new echo "Moving $line" done
    
por 16.12.2014 / 15:38