Como uso o find para copiar todos os arquivos encontrados para um novo nome em seus mesmos diretórios?

4

Eu tenho um comando simples que faz quase o que eu quero. A seguir, localizamos todos os arquivos com um sufixo '_compressed.swf' e copiamos cada um no mesmo diretório com um '.bak2' anexado:

encontre '../content' -name '* _compressed.swf' -print0 | xargs -0 -I {} cp {} {} .bak2

Resultados
Em: /content/somefile_compressed.swf
Out: /content/somefile_compressed.swf.bak2

No entanto, eu preciso substituir '_compressed.swf' por '_content.swf' Eu gostaria de usar find, ao invés de sinalizador recursivo no cp para consistência.

Objetivo
Em: /content/somefile_compressed.swf
Out: /content/somefile_content.swf

    
por Michael Prescott 23.02.2010 / 18:22

3 respostas

4

Esta solução é provavelmente a mais portátil:

find "../content" -name "*_compressed.swf" -exec sh -c 'cp {} 'dirname {}'/'basename {} compressed.swf'content.swf' \;

Existe também o famoso script rename.pl que é distribuído com Perl, e o renomear comando que poderia ter facilitado isso. Eles não estão disponíveis em todas as distribuições, mas esses comandos são na maior parte.

    
por 23.02.2010 / 19:07
1

Tenho certeza de que tudo isso pode ser tratado em uma linha. Cheguei muito perto de uma solução de uma linha e com alguma ajuda ainda mais perto, mas sem sucesso. Os seguintes trabalhos:

#!/bin/bash

# Read all file names into an array
FilesArray=($(find "../content" -name "*_compressed.swf"))

# Get length of an array
FilesIndex=${#FilesArray[@]}


# Use for loop read all directory names
for (( i=0; i<${FilesIndex}; i++ ));
do
    source="${FilesArray[$i]}"
    destination="$(echo "${source}" | sed 's/compressed/content/')"
    cp "${source}" "${destination}"
done

exit 0;
    
por 24.02.2010 / 05:06
0

Acredito que isso deva funcionar e que seja colapsável em um único liner se você realmente precisar;)

find ../content -name '*_compressed.swf' | while read file
do
cp "$file" "${file/_compressed.swf/_content.swf}"
done

A substituição do padrão bash funciona bem nesses casos.

    
por 25.02.2010 / 02:59