Ich möchte, dass mein Shell-Skript alle Unterverzeichnisse in einem Hauptverzeichnis aufruft. Machen Sie etwas in Verzeichnissen, senden Sie die Ausgabe an eine Spooldatei und fahren Sie mit dem nächsten Verzeichnis fort. Betrachten Sie Main Dir = / tmp Sub Dir = ABCD (vier Unterverzeichnisse)
bash
shell-script
Ashish
quelle
quelle
Antworten:
Benutze eine
for
Schleife:Es werden nur die Unterverzeichnisse des Verzeichnisses durchsucht
/path/to/dir
. Beachten Sie, dass das obige einfache Beispiel fehlschlägt, wenn die Verzeichnisnamen Leerzeichen oder Sonderzeichen enthalten. Ein sicherer Ansatz ist:Oder im Klartext
bash
:(Beachten Sie, dass man im Gegensatz dazu
find
auch Symlinks zu Verzeichnissen berücksichtigt und versteckte ausschließt)quelle
find
.date +"%m%d20%Y"
| xargs echo echo $ ddate +"%m%d20%Y"
| xargs echo echo $ d Das erwartete Ergebnis ist ls -ltr aus allen Unterverzeichnissen . Die obige Schleife funktioniert nichtIch bin ein
bash
absoluter Neuling, aber ein UN * X-Veteran. Obwohl dies zweifellos in Bash-Shell-Skripten möglich ist, haben wir dies früher getanfind [-maxdepth <levels>] <start-dir> -exec <command> ;
. Duman find
könntest ein Spiel machen, vielleicht bis dir jemand sagt, wie es gehtbash
!quelle
find
Befehls.$(find...)
Sache ist schlechte Praxis .Sieht so aus, als ob Sie die Dateinamen unter jedem der Unterverzeichnisse haben möchten. Das
ls -l | awk
ist nicht robust genug. Wofür, wenn diese Dateinamen Leerzeichen und / oder Zeilenumbrüche enthalten? Das Folgendefind
würde sogar fürfind
s funktionieren, die nicht das richtige-maxdepth
für sie sind:quelle
Ich habe die Lösung. Der folgende Suchbefehl entspricht meinen Anforderungen.
quelle
Es ist auch möglich, ls, grep und tr zu verwenden
du / sed kann auch als Selektor verwendet werden, wenn Ihrem ls die oben genannten Optionen fehlen
Es kann wichtig sein, zu beachten, dass diese Beispiele versteckte Verzeichnisse zurückgeben und übergeordnete und aktuelle Verzeichnisse ausschließen
quelle
ls
Schreibt-1
standardmäßig eine Datei pro Zeile (wie in der Option angegeben), wenn die Standardausgabe eine Pipe ist (daher ist dies in Ihren Antworten überflüssig). (2) Das Parsen der Ausgabe vonls
ist eine schlechte Idee - sehen Sie dies und das . Ihre erste Antwort schlägt fehl, wenn Verzeichnisse Leerzeichen (oder Zeilenumbrüche) im Namen haben, und alle schlagen fehl, wenn sie Zeilenumbrüche im Namen haben. (3) Sie sollten immer Shell-Variablen (z. B."$dir"
) angeben , es sei denn, Sie haben einen guten Grund, dies nicht zu tun, und Sie sind sicher, dass Sie wissen, was Sie tun.