find . -name '*.gz' -type f -exec bash -o pipefail -Cc '
for file do
gunzip < "$file" | xz > "${file%.gz}.xz" && rm -f "$file"
done' bash {} +
O -C
evita sobrescrever um arquivo existente e não seguirá os links simbólicos exceto se o arquivo existente for um arquivo não regular ou um link para um arquivo não regular, portanto você não perder dados, a menos que você tenha, por exemplo, um file.gz
e um file.xz
, que é um link simbólico para /dev/null
. Para proteger-se disso, você pode usar zsh
e também usar o recurso -execdir
de algumas find
implementações para uma boa medida e evitar algumas condições de corrida:
find . -name '*.gz' -type f -execdir zsh -o pipefail -c '
zmodload zsh/system || exit
for file do
gunzip < "$file" | (
sysopen -u 1 -w -o excl -- "${file%.gz}.xz" && xz) &&
rm -f -- "$file"
done' zsh {} +
Ou para limpar xz
arquivos em recompressões com falha:
find . -name '*.gz' -type f -execdir zsh -o pipefail -c '
zmodload zsh/system || exit
for file do
sysopen -u 1 -w -o excl -- "${file%.gz}.xz" &&
if gunzip < "$file" | xz; then
rm -f -- "$file"
else
rm -f -- "${file%.gz}.xz"
fi
done' zsh {} +
Se você preferir que seja curto e esteja pronto para ignorar alguns desses possíveis problemas, em zsh
, você pode fazer
for f (./**/*.gz(D.)) {gunzip < $f | xz > $f:r.xz && rm -f $f}