Como posso usar o sed para alterar os resultados de encontrar e passar os resultados para o cp?

5

No solaris, gostaria de copiar todos os arquivos encontrados pelo comando find para um caminho ligeiramente diferente. O script a seguir basicamente executa cp para cada arquivo encontrado por find. Por exemplo:

cp ./content/english/activity1_compressed.swf ./content/spanish/activity1_compressed.swf
cp ./content/english/activity2_compressed.swf ./content/spanish/activity2_compressed.swf
...

#!/bin/bash

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

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

# Copy each file from english to spanish folder
# Ex: cp ./english/activity_compressed.swf ./spanish/activity_compressed.swf
for (( i=0; i<${FilesIndex}; i++ ));
do
    source="${FilesArray[$i]}"

    # Replace "english" with "spanish" in path  
    destination="$(echo "${source}" | sed 's/english/spanish/')"

    cp "${source}" "${destination}"
done

exit 0;

Parece um pouco demais e gostaria de saber como usar o sed em linha com os comandos find e cp para obter a mesma coisa. Eu teria esperado algo como o seguinte, mas aparentemente parênteses não são métodos aceitáveis para mudar a ordem de operação:

find . -name *_compressed -exec cp {} (echo '{}' | sed 's/english/spanish/')
    
por Michael Prescott 02.03.2010 / 05:18

2 respostas

7

Existem maneiras mais fáceis, mas, por portabilidade, podemos usar um pouco de bifurcação e backticks:

find . -name *_compressed -exec sh -c 'cp {} 'echo {} | sed 's/english/spanish/''' \;
    
por 02.03.2010 / 05:42
1

Eu usaria o backtick: você encontrará mais sobre aqui (o backtick está no capítulo 3.4.5).

Basicamente, quando você coloca um comando entre os backticks, o próprio comando será substituído em sua saída.

    
por 02.03.2010 / 05:49