É difícil fazer isso sem usar um script auxiliar (ou uma função bash) como feito em outra resposta, mas não impossível.
Aqui, usando a opção -execdir
da expansão do parâmetro find
e alguns bash
.
find /opt/fooapp/foosubdirectory -name '*.gz' -execdir /bin/bash -c 'pwd ; echo ${0%.gz}; cp ${0} ${0%.gz}.tmp.gz ; gunzip ${0%.gz}.tmp.gz ; mv ${0%.gz}.tmp ${0%.gz}' {} \;
[edit] NOTA: você precisa de uma versão recente de bash
(para este parâmetro específico), algumas versões mais antigas não possuem este recurso. Eu testei isso em um V 3.2.x
[Edit] NOTE2: A expressão -execdir
, até onde eu sei, está presente no GNU find
(e outras implementações modernas), mas não nas mais antigas. Eu testei isso no GNU find v 4.2.x
O mesmo rewitten por legibilidade & comentário:
find /opt/fooapp/foosubdirectory
-name '*.gz'
-execdir /bin/bash -c '_bash_command_string_ ' {} \;
# This ^ will run bash from the subdirectory containing the matched file
_bash_command_string_ -->
pwd ; # we are working in this subdir
echo ${0%.gz}; # this is matched filename (minus final .gz)
cp ${0} ${0%.gz}.tmp.gz ; # copy the .gz file as .tmp.gz
gunzip ${0%.gz}.tmp.gz ; # gunzip the .tmp.gz as .tmp
mv ${0%.gz}.tmp ${0%.gz} # rename .tmp as matched filename (minus final .gz)
Esta solução é interessante como um hack inteligente, mas provavelmente muito complexo para ser usado na prática.
Veja Referência do Bash - Expansão do Parâmetro do Shell , pesquisa ${parameter%word}
.