
Ich möchte eine Liste von Verzeichnissen in einem Ordner erfassen und die Liste in eine ausführbare Datei ausgeben, die sie zum Ausführen von etwas verwendet.
Im Wesentlichen erfordern diese Bash-Dateien eine Liste von Ordnern in meinem , die von , , , $directory
variieren und manchmal bis zu 30 reichen. Alle Unterordner werden mit dem Symbol angehängt.@sub1
@sub2
@sub3
@
Derzeit füge ich die Unterordner manuell zu meiner Liste hinzu und rufe sie mit auf , wobei „subs“ oben als … usw. -sub="$subs"
definiert ist.
subs="$directory/@sub1;$directory/@sub2;
Ich muss die gleiche Formatierung für die Ausgabe beibehalten, um der Art und Weise gerecht zu werden, wie die ausführbare Datei erstellt wird.
Wie kann ich das am besten automatisieren? Entschuldigen Sie, wenn das etwas seltsam klingt, aber das ist meine erste Frage hier.
Antwort1
Mögliche Lösung:find . -type d -name '@*' -print0 -maxdepth 1 | xargs -0 yourprog
Zunächst ein leerer Ordner, einige Ordner mit dem Namen @subX, eine Datei, die wir nicht wollen.
mkdir test
cd test
mkdir @sub1
mkdir @sub2
mkdir @sub3
mkdir subway
touch testfile
cd \@sub2
touch bar
mkdir @test
cd ..
Mit können Sie Dinge finden und sie entweder auf Standardausgabe drucken, etwas damit ausführen und ähnliches find
. Verwenden Sie dies, anstatt zu versuchen, die ls-Ausgabe zu analysieren.
Das erste Argument ist der zu durchsuchende Ordner (zB find .
das aktuelle Verzeichnis)
-type d
filtert nur nach Verzeichnissen (keine Dateien)
-name '@*'
jede Übereinstimmung, die mit einem @ beginnt
-print0
Drucken Sie das Ergebnis auf der Standardausgabe. -print funktioniert auch, aber -print0 macht bei Leerzeichen usw. besondere Aktionen.
-maxdepth 1
Unterordner nicht durchsuchen)
Ergebnis find . -type d -name '@*' -print0 -maxdepth 1
im Setup von oben:
./@sub1./@sub2./@sub3
Beachten Sie, dass diese mit ./ beginnen, was für Sie möglicherweise ein Problem darstellt, möglicherweise aber auch nicht.
Ebenfalls lesenswert: die Option -exec von find und find ..... {} +;