
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 c
oder 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 -delete
angegeben ist ( find
warnt davor und wird nicht fortgesetzt, wenn -prune
angegeben ist). Sie können die Ausgabe jedoch immer an xargs
und weiterleiten oder anstelle von rm
schreiben .-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 find
s, 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 {
}
}