Classifique os arquivos em pastas, dependendo do tipo de arquivo

3

Eu tenho cerca de 2,8 TB (sim, terabytes) de dados que recuperei, isso será verificado para duplicatas, a máquina em que esses arquivos residem é bastante antiga e tem apenas 2 GB de memória (funciona bem para o LVM, no entanto), então, fazer a varredura duplicada está pedindo dor.

A minha pergunta é: como posso fazer com que o Debian mova os arquivos para uma pasta com esse tipo de arquivo, renomeie automaticamente onde for necessário sem precisar especificar uma lista de tipos de arquivos.

Tenho cerca de 800 GB de espaço livre, por isso posso fazer alguns testes antes de deixar isto correr solto nos meus dados.

    
por MrMe01 24.06.2016 / 00:13

2 respostas

0

Com um diretório parecido com

$ ls   
another.doc  file.txt  file1.mp3  myfile.txt

Podemos criar uma lista de extensões de arquivos com este comando:

$ exts=$(ls | sed 's/^.*\.//' | sort -u)

Podemos percorrer essas extensões movendo os 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
    
por 24.06.2016 / 00:36
0

Eu 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 ---"
    
por 28.05.2018 / 09:10