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/''' \;
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/')
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/''' \;
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.