Entfernen aller bis auf 1 Datei und 1 Verzeichnis in Linux

Entfernen aller bis auf 1 Datei und 1 Verzeichnis in Linux

Ich möchte aus dem Verzeichnis, in dem ich mich aktuell befinde, alle Dateien und Verzeichnisse bis auf eine löschen. Wie gehe ich dabei vor?

Ich habe ein Verzeichnis mit drei Verzeichnissen a, b, c und drei Dateien 1.php, 2.php, 3.php. Ich möchte nur die Verzeichnisse a und b sowie die Dateien 1.php und 2.php entfernen. Ich suche nach einer Lösung, die dies einfacher macht. Ich suche nach einer Lösung, die in größerem Maßstab mit mehr Ordnern und Dateien verwendet werden kann.

Antwort1

find directory -not \( -name temp -o -name 3.php -o -name c -prune \) -delete

Ein kurzer Testfall zeigte, dass es zumindest in diesem Fall funktionierte. Wenn es Unterverzeichnisse mit dem Namen eg coder so gibt, können Sie diese meiner Meinung nach auch ausschließen. Es ist einfach, es in allgemeinen Fällen zum Laufen zu bringen, aber um einen Find-Befehl in aller Allgemeinheit zu definieren, sind einige Tests erforderlich.

Testen Sie ohne die Anweisung „-delete“, um zu sehen, welche Dateien übereinstimmen.

PRESSTOP: findändert sein Verhalten, wenn -deleteangegeben ist ( findwarnt davor und wird nicht fortgesetzt, wenn -pruneangegeben ist). Sie können die Ausgabe jedoch immer an xargsund weiterleiten oder anstelle von rmschreiben .-execdir rm {} \;-delete

Beispiele:

find directory -not \( -name directory -o -name 3.php -o -name c -prune \) -execdir rm -r {} \;
find directory -not \( -name directory -o -name 3.php -o -name c -prune \) -print0 | xargs -0 rm -r

Es ist immer eine heikle Angelegenheit, und wenn das Ziel darin besteht, Dateien zu löschen, müssen Sie umfangreiche Testfälle durchführen. Bei mir laufen jede Nacht mehrere ähnliche finds, und ich kann nicht sagen, dass ich nicht nervös war, als ich sie freigab :-)

Antwort2

Mein Instinkt sagt mir: Wenn Sie nur eine Datei und ein Verzeichnis zu speichern haben, kopieren Sie diese an einen sicheren Ort und löschen Sie den Rest.

cp /dir/file.txt /safe/dir/
cp -R /dir/to/save /safe/dir/
rm -rf /dir/

Antwort3

Versuchen Sie das folgende Skript in Pseudoperl:

#request the file you don't want to delete and store the name in a scalar variable.

opendir(DIRHANDLE, ".") || die "Could not open Directory handle.";
@list = readdir(DIRHANDLE);

foreach $name (@list) {
if($name != $your_input_variable) {
unlink($name);
} else {
}
}

verwandte Informationen