Não sei qual é o requisito para um único comando, mas isso chega bem perto:
(cd /directory/; find -type f -printf '%P(cd /directory/; find -type f -printf '%P%pre%' | while IFS= read -r -d '' fn; do
awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~"
mv "$fn.~" "$fn"
done)
' | while IFS= read -r -d '' fn; do
awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~"
mv "$fn.~" "$fn"
done)
A primeira linha simplesmente lê os nomes dos arquivos da forma mais robusta possível.
A segunda linha é onde todo o trabalho acontece:
- o awk adiciona uma contagem de caracteres (+ espaço) ao início de cada linha
- sort -n (numérico), -u (exclusivo) e -r (reverso) processam o arquivo
- sed remove a contagem de caracteres iniciais
- então é despejado em um arquivo temporário
A linha mv grava o arquivo temporário sobre o original (como não pode ser feito durante o pipeline).