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