Embora o problema geral de identificar extensões seja difícil, você pode limpar o script um pouco:
- Diga
findpara considerar apenas arquivos com uma extensão:-iname '*.*' - Use
awkem vez decutvocê mesmo: - Use um script e, em seguida, diga
findpara executar esse script.
Assim: um script chamado, digamos, move.sh :
#! /bin/bash
for i
do
ext=/some/where/else/$(awk -F. '{print $NF}' <<<"$i")
mkdir -p "$ext"
mv "$i" "$ext"
done
Em seguida, execute find assim:
find . -name '*.*' -type f -exec move.sh {} +
Isso tem o problema que você não pode reorganizar dentro da pasta, então você pode usar xargs :
find . -name '*.*' -type f -print0 > /tmp/temp
xargs -0 move.sh < /tmp/tmp
Não tenho muita certeza da eficiência envolvida, mas outra abordagem seria obter todas as extensões e, em seguida, mover todos os arquivos envolvidos de uma só vez.
Algo como:
find . -name '*.*' -type f -print0 | sed -z 's/.*\.//g' | sort -zu > /tmp/file-exts
Isso deve fornecer uma lista de extensões de arquivo exclusivas. Então, nosso move.sh será parecido com:
#!/bin/bash
for i
do
mkdir -p "$i"
find . -name "*.$i" -type f -exec mv -t "$i" {} +
done
E nós vamos executá-lo:
xargs -0 move.sh < /tmp/file-exts
Eu faço algumas suposições neste post, como sed e sort support -z (permitindo que trabalhem com as linhas terminadas em NUL que find e xargs prosperam). / p>