Ich möchte alle Unterverzeichnisse und Dateien in einem bestimmten Verzeichnis löschen, außer Verzeichnisse, die einem bestimmten Muster entsprechen:
example_dir/model-*/gen-*/share/**
Allgemeines Setup: Ich habe mehrere Modelle (> 100) generiert, von denen jedes >=1 Generation(en) hat. Innerhalb dieser Modelle (z. B. example_dir/model-0/gen-0/
) gibt es mehrere Verzeichnisse und Unterverzeichnisse.
Gewünschtes Ergebnis: Ich möchte alle Verzeichnisse und Dateien löschen, außer denen, die übereinstimmen:
example_dir/model-*/gen-*/share/
Innerhalb jedes einzelnen Modells/Generation/sähe es ungefähr so aus:
rm -rf !(share)
Antwort1
Ich bin mir nicht sicher, ob ich Ihre Frage ganz verstehe, und ich bin mir nicht sicher, welche Folgefragen sinnvoll sind. Eine Sache, die ich mich frage, ist, ob Sie einen Verzeichnisbaum wie
example_dir
|-- model-0
| |-- gen-0
| | |-- share
| | |-- trash
| | | |-- more_trash
| | |-- file123.txt
| |-- grandfather
|-- platypus
foo
reicht es aus, example_dir/model-0/gen-0/trash
(und dessen Inhalt) zu löschen, oder möchten Sie auch
example_dir/model-0/grandfather
, example_dir/platypus
und löschen foo
? Und wie wäre es mit example_dir/model-0/gen-0/file123.txt
?
trash
Wenn Sie (und dessen Inhalt) und löschen möchten file123.txt
, versuchen Sie
#!/bin/bash
shopt -s extglob
echo rm -rf example_dir/model-*/gen-*/!(share)
trash
Wenn Sie (und den Inhalt) löschen, aber beibehalten möchten file123.txt
, versuchen Sie
#!/bin/bash
shopt -s extglob
echo rm -rf example_dir/model-*/gen-*/!(share)/
(Hinzufügen eines /
nach !(share)
).
Sehen Sie sich in jedem Fall die Ausgabe sorgfältig an und führen Sie den Befehl ohne das noch einmal aus, wenn Sie sicher sind, dass es das ist, was Sie möchten echo
.
Wenn Sie auch andere Verzeichnisse der obersten Ebene als example_dir
, Verzeichnisse der ersten Ebene, die nicht dem model-*
Muster entsprechen, oder Verzeichnisse der zweiten Ebene, die nicht dem gen-*
Muster entsprechen, löschen möchten, bearbeiten Sie Ihre Frage bitte zur Klarstellung.