Embora o problema geral de identificar extensões seja difícil, você pode limpar o script um pouco:
- Diga
find
para considerar apenas arquivos com uma extensão:-iname '*.*'
- Use
awk
em vez decut
você mesmo: - Use um script e, em seguida, diga
find
para 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>