
Dies ist meine erste Frage. Danke, dass ich sie stellen durfte und dass Sie sie gelesen haben!
Ich verwende Ubuntu 22.04 mit GNOME Shell und der Bash-Shell. Ich habe einen Ordner mit über 800 Unterverzeichnissen. Jedes Unterverzeichnis enthält 4 bis 8 Versionen desselben Videos in unterschiedlichen Auflösungen. Für jedes Video/Unterverzeichnis möchte ich nur die beste Auflösung behalten.
Wie lösche ich rekursiv alle Dateien in allen Unterverzeichnissen und behalte dabei nur die größte Datei in jedem Unterverzeichnis?
Antwort1
Es tut mir leid, ich werde kein Skript für Sie schreiben, aber hier ist ein möglicher Algorithmus, der verwendet werden könnte. (Obwohl im Folgenden Skriptelemente verwendet werden, handelt es sich bei weitem nicht um ein genaues Skript, und der bloße Versuch, Befehle einzufügen, könnte katastrophale Folgen haben.)
Bevor Sie dies tun, empfehle ich dringend, die gesamte Verzeichnisstruktur auf eine andere Festplatte zu kopieren, auf der Sie ein Skript testen können, bevor Sie es ausführen, und versehentlich Dateien löschen können, die Sie nicht wiederherstellen können
- Aus dem obersten Verzeichnis
fldrLst='find ./ -type d'
(ich verwende einfache Anführungszeichen für linke Häkchen) - Führen Sie vom obersten Verzeichnis aus eine Schleife durch
$fldrLst
und führen Sie dabei Folgendes aus:- Holen Sie sich eine Liste von Dateien aus einem einzelnen Verzeichnisblatt in absteigender Dateigröße:
fileLst='find $fldrList[n] -type f -maxdepth 1 -exec ls -al {} \; | sort k 5 -nr'
wobei[n]
ein bestimmtes Mitglied des Listen-Arrays ist. - Dateien im Verzeichnisblatt zählen:
echo $fildLst | wc -l
- Entfernen Sie jede Datei nach dem ersten Eintrag (dies sollte die größte Datei sein): Durchlaufen
$fileLst
und entfernenrm $fileList[n]
(wobei der ersten
der zweite Eintrag im Array ist).
- Holen Sie sich eine Liste von Dateien aus einem einzelnen Verzeichnisblatt in absteigender Dateigröße:
Dies sollte Sie auf den richtigen Weg zur Erfüllung Ihrer Aufgabe bringen.
Wenn Ihnen diese Antwort beim Erzielen Ihrer Lösung hilft, markieren Sie sie unbedingt als Antwort oder bewerten Sie sie positiv als Teillösung.
Antwort2
linux - Entfernen Sie alle Dateien außer der größten - Super User
In der Testversion werden nur die Dateien gelöscht, die entfernt werden würden:
find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r ls -l
Die funktionierende Version entfernt Ihre Dateien:
find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r rm
Originalcode vonKamil Maciorowski