wie Sie navigieren, um Unterverzeichnisse in einem shell-Skript
Ich habe ein Verzeichnis.Dieses Verzeichnis hat eine Menge von Unterverzeichnissen, die enthalten html-Seiten und manche c-source-code-Dateien,Makefiles etc etc.Das Skript, das ich bin versucht, zu schreiben wäre, ausgeführt von einem Verzeichnis, das alle diese Unterverzeichnisse.
Im folgenden ist der Satz von Verzeichnissen und Dateien, die Sie sehen können
ls
delete.sh lddbus Makefile misc-progs sbull scullc scullp short simple snull usb
include LICENSE misc-modules pci scull sculld scullv shortprint skull tty
Einige von Ihnen sind Verzeichnisse und einige Dateien in den Unterverzeichnissen oben genannten gibt es weitere Unterverzeichnisse und html-Seiten auch, die ich will, zu beseitigen.
Der manuelle Weg wäre, die tun, gehen Sie zu jedem Verzeichnis und entfernen Sie die Seiten, die Sie über folgenden Befehl
rm *.html*
Da die html-Seite mit name endend mit ?=/something
Sortieren von Namen.
So habe ich beschlossen, schreiben Sie ein shell-Skript.
Was ich aber bin nicht klar ist, wie werde ich die Verzeichnisnamen als Argumente in meinem shell-script.Wenn ich mich entschieden habe, eine for-Schleife oder etwas ähnliches Ding.
In diesem Fall, was soll ich tun?
Ich will nicht zu verwenden
find . -name '*.html*' -exec rm -f {} \;
Als ich Tue dies für das lernen Zweck.
- Einfachste Weg: verwenden Sie eine rekursive Funktion.
- Ich bin nicht klar mit diesem können Sie einige Beispiel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser code wird ausgeführt
ls
für jedes Unterverzeichnis im aktuellen Verzeichnis:Können Sie es anpassen, um einen Befehl auszuführen, für jedes Unterverzeichnis, das Sie möchten.
Wenn Sie möchten, um tiefer in die Verzeichnis-Hierarchie, Sie können wickeln Sie diesen code in eine Funktion und es erneut für jeden subdir.
Für Zsh würden Sie wahrscheinlich wollen zu setzen NULL_GLOB option (Schalter-G), so dass es nicht Fehler melden, wenn es gibt keine versteckten Verzeichnisse, in der Bash funktioniert es per default.
ls -1
wo hast du das lernst?ls
. Lesen Sie Warum sollten Sie nicht Parsen der Ausgabe von ls, um herauszufinden, warum.ls
tut, ist genauso einfach, wenn nicht einfacher, ich sehe nicht einen guten Grund zu üben, schlechte Gewohnheiten.ls
- und steuerzeichen scheint fast nicht existent=) Aber im Allgemeinen, ja, wenn Sie sich wirklich für "und was wäre, wenn?" - Ansatzls
ist nicht die beste Lösung.`ls -1`
mit einem*
korrekte Verhalten in die Ecke zu Fällen.f .
find
hat das gleiche problem in geringerem Maße.) Es ist leicht zu vermeiden, hier: führen Sie jede Abfahrt in einer subshell, also den code der Funktion in Klammern.*
nicht mit Unterverzeichnissen, deren name beginnt mit einem Punkt. Sie können* .[!.]* ..*
statt...?*
.Mit bash-4 (oder zsh), die Sie verwenden können, globstar "**" match rekursiv.
Mit einem Verzeichnis wie folgt aufgebaut:
Ergebnis:
find
ist der Weg zu gehen. Sie wird nicht lernen, was nützlich, die Wahl der falschen Art und Weise ein problem zu lösen.Drucken einer Liste der Dateien, die Sie entfernen möchten
löschen und
find
ist ein mächtiger Befehl, lernen, es zu benutzen.Andere Art und Weise zu verbessern, den Befehl, den Sie nicht verwenden wollen:
(Tipp:
man find
zu lernen, wie-exec ;
und-exec +
unterscheiden)Beachten Sie, dass im shell-Skripting ist nur unter Verwendung der in der besten Weise sinnvoll nutzen die kleinen Programme wie
find
,cat
,ls
,wc
usw. Das wissen um diese Dienstprogramme gründlich ist eine notwendige Voraussetzung, um zu lernen, shell scripting.Erstellen Sie eine Funktion, etwa so:
Rufen Sie dann die Funktion durch die übergabe der Verzeichnisse, die Sie entfernen möchten .html - von
- Ausgang
Einmal sind Sie zufrieden mit dem Ausgang, entfernen Sie die
echo
haben Sie wirklich die Dateien löschen.Diese basiert auf maarons' Antwort, aber mit zwei Vorteilen:
*/
statt*
imfor
Schleife bedeutet, dass es nur durchläuft Verzeichnisse anstatt alle Dateien für eine potenziell große speeduppushd
undpopd
macht es einfach, zu unterstützen.
oder kein argument, dass das aktuelle Verzeichnis.Hier ist die Funktion:
Natürlich mit
find
mit-execdir
ist einfacher und gibt die gleichen Ergebnisse.:find
- version nicht (es sei denn, Sie fügen-L
).*/
eher als*
ist, wird die Funktion recurse-in das symbolische links auf Verzeichnisse.