Classifique os arquivos em pastas, dependendo do tipo de arquivo

Classifique os arquivos em pastas, dependendo do tipo de arquivo

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

informação relacionada