Wie löscht man unter Linux alle Dateien in allen Unterverzeichnissen und behält dabei die größte Datei in jedem Unterverzeichnis?

Wie löscht man unter Linux alle Dateien in allen Unterverzeichnissen und behält dabei die größte Datei in jedem Unterverzeichnis?

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

  1. Aus dem obersten Verzeichnis fldrLst='find ./ -type d'(ich verwende einfache Anführungszeichen für linke Häkchen)
  2. Führen Sie vom obersten Verzeichnis aus eine Schleife durch $fldrLstund 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 $fileLstund entfernen rm $fileList[n](wobei der erste nder zweite Eintrag im Array ist).

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

verwandte Informationen