Tenho cerca de 2,8 TB (sim, terabytes) de dados que recuperei, isso será verificado em busca de duplicatas, a máquina em que esses arquivos residem é bastante antiga e tem apenas 2 GB de memória (funciona bem para LVM, no entanto), fazendo o varredura duplicada está pedindo dor.
Minha pergunta é: como posso fazer com que o Debian mova arquivos para uma pasta com esse tipo de arquivo, renomeie automaticamente quando necessário, sem precisar especificar uma lista de tipos de arquivos.
Tenho cerca de 800 GB de espaço livre nele, então posso fazer alguns testes antes de liberar meus dados.
Responder1
Envolvi o código de Stephen em um script e melhorei um pouco o canal.
#!/bin/bash
set -e
set -u
set -o pipefail
start=$SECONDS
exts=$(ls -dp *.*| grep -v / | sed 's/^.*\.//' | sort -u) # not folders
ignore=""
while getopts ':f::i:h' flag; do
case "$flag" in
h)
echo "This script sorts files from the current dir into folders of the same file type. Specific file types can be specified using -f."
echo "flags:"
echo '-f (string file types to sort e.g. -f "pdf csv mp3")'
echo '-i (string file types to ignore e.g. -i "pdf")'
exit 1
;;
f)
exts=$OPTARG;;
i)
ignore=$OPTARG;;
:)
echo "Missing option argument for -$OPTARG" >&2;
exit 1;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
for ext in $exts
do
if [[ " ${ignore} " == *" ${ext} "* ]]; then
echo "Skiping ${ext}"
continue
fi
echo Processing "$ext"
mkdir -p "$ext"
mv -vn *."$ext" "$ext"/
done
duration=$(( SECONDS - start ))
echo "--- Completed in $duration seconds ---"
Responder2
Com um diretório que se parece com
$ ls
another.doc file.txt file1.mp3 myfile.txt
Podemos construir uma lista de extensões de arquivo com este comando:
$ exts=$(ls | sed 's/^.*\.//' | sort -u)
Podemos então percorrer essas extensões movendo arquivos para subdiretórios:
$ for ext in $exts
> do
> echo Processing $ext
> mkdir $ext
> mv -v *.$ext $ext/
> done
Quando isso é executado, obtemos a seguinte saída:
Processing doc
'another.doc' -> 'doc/another.doc'
Processing mp3
'file1.mp3' -> 'mp3/file1.mp3'
Processing txt
'file.txt' -> 'txt/file.txt'
'myfile.txt' -> 'txt/myfile.txt'
O resultado:
$ ls
doc/ mp3/ txt/
$ ls *
doc:
another.doc
mp3:
file1.mp3
txt:
file.txt myfile.txt