Renomeando vários arquivos que correspondem à palavra-chave find do UNIX

2

Eu tenho a seguinte saída do comando find para localizar arquivos contendo yyy em name:

./plonetheme/xxx/yyy-logo.png
./plonetheme/xxx/profiles/default/plonetheme.yyy_various.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_images
./plonetheme/xxx/skins/plonetheme_yyy_custom_images/CONTENT.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates/CONTENT.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates/main_template.pt
./plonetheme/xxx/skins/plonetheme_yyy_styles
./plonetheme/xxx/skins/plonetheme_yyy_styles/base_properties.props
./plonetheme/xxx/skins/plonetheme_yyy_styles/CONTENT.txt

Como renomear todos os arquivos para que a string yyy seja substituída por zzz ?

    
por Mikko Ohtamaa 26.02.2013 / 00:43

2 respostas

6

Você pode usar a manipulação de string bash para obter o que deseja:

find PATH/PATTERN -exec bash -c 'mv "$0" "${0/yyy/zzz}"' {} \;

A opção -exec executa o comando até o escape ; , em que {} é o caminho do arquivo que está sendo manipulado no momento.

bash -c 'mv "$0" "${0/cix/stix}"' {} passa esse caminho como um argumento para bash, que move $0 (o primeiro argumento, por exemplo, ./plonetheme/xxx/yyy-logo.png ) para ${0/yyy/zzz} (o primeiro argumento manipulado, por exemplo, ./plonetheme/xxx/zzz-logo.png ).

    
por 26.02.2013 / 01:00
2

Conforme descrito aqui , você pode usar -print0 e read -r -d'' :

find /path/to/files -type f -print0 | while IFS= read -r -d '' file; do
    mv "$file" "${file/yyy/zzz}"
done
    
por 26.02.2013 / 01:04