Sortieren Sie Dateien je nach Dateityp in Ordner

Sortieren Sie Dateien je nach Dateityp in Ordner

Ich habe etwa 2,8 TB (ja, Terabyte) an Daten wiederhergestellt, diese werden auf Duplikate geprüft. Die Maschine, auf der sich diese Dateien befinden, ist ziemlich alt und hat nur 2 GB Speicher (funktioniert jedoch gut für LVM), daher ist die Durchführung der Duplikatprüfung darauf ein Muss.

Meine Frage ist nun: Wie kann ich Debian dazu bringen, Dateien in einen Ordner mit diesem Dateityp zu verschieben und sie bei Bedarf automatisch umzubenennen, ohne eine Liste von Dateitypen angeben zu müssen?

Ich habe etwa 800 GB freien Speicherplatz darauf, sodass ich einige Tests durchführen kann, bevor ich meine Daten damit unkontrolliert überlaste.

Antwort1

Ich habe Stephens Code in ein Skript gepackt und die Pipe leicht verbessert.

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

Antwort2

Mit einem Verzeichnis, das aussieht wie

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

Mit diesem Befehl können wir eine Liste mit Dateierweiterungen erstellen:

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

Wir können dann diese Erweiterungen durchlaufen und Dateien in Unterverzeichnisse verschieben:

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

Wenn dies ausgeführt wird, erhalten wir die folgende Ausgabe:

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'

Das Ergebnis:

$ ls
doc/  mp3/  txt/

$ ls *
doc:
another.doc

mp3:
file1.mp3

txt:
file.txt  myfile.txt

verwandte Informationen