Ordene los archivos en carpetas, según el tipo de archivo

Ordene los archivos en carpetas, según el tipo de archivo

Tengo alrededor de 2,8 TB (sí, terabytes) de datos que he recuperado, estos se escanearán en busca de duplicados, la máquina en la que residen estos archivos es bastante antigua y solo tiene 2 GB de memoria (sin embargo, funciona bien para LVM), así que al hacerlo El escaneo duplicado pide dolor.

Mi pregunta es la siguiente: ¿cómo puedo hacer que Debian mueva archivos a una carpeta con ese tipo de archivo y cambie el nombre automáticamente cuando sea necesario sin necesidad de especificar una lista de tipos de archivo?

Tengo alrededor de 800 GB de espacio libre, por lo que puedo hacer algunas pruebas antes de dejar que esto se pierda con mis datos.

Respuesta1

Envolví el código de Stephen en un script y mejoré ligeramente la tubería.

#!/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 ---"

Respuesta2

Con un directorio que se parece

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

Podemos construir una lista de extensiones de archivos con este comando:

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

Luego podemos recorrer estas extensiones moviendo archivos a subdirectorios:

$ for ext in $exts
> do
> echo Processing $ext
> mkdir $ext
> mv -v *.$ext $ext/
> done

Cuando se ejecuta esto obtenemos el siguiente resultado:

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'

El resultado:

$ ls
doc/  mp3/  txt/

$ ls *
doc:
another.doc

mp3:
file1.mp3

txt:
file.txt  myfile.txt

información relacionada