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