Supondo que você esteja em um sistema de arquivos no qual os diretórios folha possuem exatamente 2 hard links, você pode usar uma combinação de find, xargs e mv da seguinte forma:
$ find . -type d -printf "%n %p\n" \
| grep '^2 ' \
| perl -ne 'chomp; s/[0-9]+\s+//; print "$_$ find . -type d -printf "%n %p\n" | grep '2 ' | cut -d " " -f 2 | xargs -I'{}' mv -v '{}' /target/
";' \
| xargs -0 -I'{}' mv -v '{}' /target/
Isso usa o find para encontrar apenas diretórios e imprimir o número de hard links que esses diretórios possuem.
Em seguida, usamos grep para remover os que não são "folhas".
Em seguida, usamos Perl para cortar a contagem de hard-link e imprimir os arquivos separados por
. -0
Finalmente, isso nos permite usar xargs com o sinal %code%
para mover os diretórios encontrados para o diretório de destino.
Usar nulos ( %code% ) em vez de novas linhas ou espaços é importante para arquivos com espaços neles. Se os nomes dos seus diretórios não tiverem espaços, você poderá simplificar um pouco.
$ find . -type d -printf "%n %p\n" \
| grep '^2 ' \
| perl -ne 'chomp; s/[0-9]+\s+//; print "$_$ find . -type d -printf "%n %p\n" | grep '2 ' | cut -d " " -f 2 | xargs -I'{}' mv -v '{}' /target/
";' \
| xargs -0 -I'{}' mv -v '{}' /target/
Mas provavelmente é melhor prevenir do que remediar.