Angenommen, ich habe eine Verzeichnisstruktur wie diese:
$ [~ / practice] ls A B C D/
Jetzt möchte ich ein Verzeichnis tmp1
in allen Unterverzeichnissen von anlegen practice
und mache folgendes:
$ [~ / practice] mkdir * / tmp1 mkdir: Verzeichnis kann nicht erstellt werden * / tmp1: Keine solche Datei oder kein solches Verzeichnis
Dann versuche ich den -p
Schalter und ich endete mit einem Verzeichnis *
mit einem Unterverzeichnistmp1
$ [~ / practice] mkdir -p * / tmp1 $ [~ / practice] ls */ A B C D/
Ich weiß, dass der -p
Schalter verwendet wird, um mehrere nicht vorhandene Verzeichnisse zu erstellen. Ich dachte nur, es könnte helfen.
Wie erstelle ich tmp1
in allen Unterverzeichnissen gleichzeitig?
Wenn dies geschehen kann, wie erweitere ich es zu schaffen \tmp1
, \tmp2
, \tmp3
in \a
, \b
und \c
auf einmal?
Edit: Ich vermisste zu erwähnen , dass die Verzeichnisse müssen nicht einfach und in Ordnung sein, wie a
, b
, c
usw., und das Verzeichnis erstellt werden soll , nicht unbedingt wie tmp1
, tmp2
.
$ [~ / practice] ls Hund / Katze / Ratte /
In ihnen möchte ich so etwas haben
$ [~ / practice] ls * Hund: rot blau/ Katze: rot blau/ Ratte: rot blau/
Antworten:
Mit Globs :
HINWEIS
*/
als Glob zu verwendenWenn Sie mehrere Unterverzeichnisse gleichzeitig erstellen möchten:
for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done
quelle
for i in */; do mkdir "$i/itemone" "$i/itemtwo"; done
für mehrere, nicht in der Reihenfolge befindliche Verzeichnisnamen vorgehen?quelle
Mit GNU oder BSD * finden:
oder mit Parametererweiterung:
* Beinhaltet OS X
quelle
find . -name . -o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;
Off Topic, seitdem Sie es erwähnen
bash
, aber für das Protokoll, mit zsh, würden Sie Folgendes tun:$^var
Aktiviert die geschweifte Erweiterung für die Erweiterung des Arrays. Es erinnert anrc
's^
Operator von und inrc
(oder dessen Ableitunges
), schreiben Sie es:Beachten Sie jedoch (und dasselbe gilt für die hier angegebenen bash-Lösungen), dass die rc-Lösung
dirs
auch symbolische Links zu Verzeichnissen enthält. In der zsh Lösung, ändern*(/)
zu ,*(-/)
wenn Sie symbolische Links zu Verzeichnissen enthalten.quelle
-p
Flag unterdrückt werden .Übertragen Sie die Schleife über die übergeordneten Verzeichnisse:
Fügen Sie
--
danach hinzu,mkdir
wenn Sie Verzeichnisse haben, deren Name mit beginnt-
.In zsh können Sie dies mit dem
e
Glob-Qualifikator in einem einzigen Befehl tun :Es ist jedoch schneller, dies als zwei Befehle einzugeben:
quelle
mkdir -- whatever
und weglassen,--
wenn Sie beabsichtigen, die Erweiterung dessen, was möglicherweise als Option für denmkdir
Befehl verwendet werden soll". Es hat keinen Sinn,--
hier wegzulassen . Im Fall des OP ist dies möglicherweise kein Problem, im allgemeinen Fall jedoch. Ich denke, wir haben die Pflicht, hier die richtige und sichere Syntax beizubringen.--
und Anführungszeichen und großen Fettwarnungen, wenn Zeilenumbrüche nicht unterstützt werden. In einem Befehlszeilenkontext zeige ich lieber die Schnellversion, die in der Praxis zuerst funktioniert, und die kugelsichere Version als Ergänzung.Das können Sie so machen:
quelle
Variation über die Antwort von sputnick, die Nicht-Verzeichnisdateien vermeidet:
quelle
if [ -d "$x" ];…
?Dies ist eine gute Version des alten Unix-Masters (getestet auf FreeBSD 10.1), wenn Sie die Versionskontrolle (mit gesperrtem RCS-Check-in: ci -l mit einem kurzen Kommentar als ir: für die Erstveröffentlichung) Ihrer / etc / * config-Dateien durchführen möchten auf ~ / .his / etc
quelle
Sollte sein \! Nennen Sie "RCS" und es funktioniert am besten beim ersten Einchecken.
sudo find ~ / .his / etc \! -name "RCS" -ls
sudo find -d ~ / .his / etc \! -name "RCS" | xargs sudo ci -l -mir -t-ir
Letzteres funktioniert auch sehr gut für den Test, indem der gesamte RCS-Inhalt nach dem Dateinamen gefiltert wird:
sudo find -d ~ / .his / etc -type f | grep -v RCS | xargs sudo ci -l -mir -t-ir
quelle
Das ist eine große Hilfe für mich. Ich musste eine Reihe von Unterverzeichnissen in mehreren Ordnern erstellen und so etwas wie:
funktioniert hervorragend, außer wenn ein Leerzeichen auftritt. Gibt es eine Möglichkeit, Leerzeichen im
*/*/
Teil der Argumente zu ignorieren ?quelle