Ich möchte einen Befehl ausführen, um:
- Suchen Sie alle Verzeichnisse mit dem Namen "
inc
" unter einem Ordner "X
". - Listen Sie alle Unterverzeichnisse unter jedem "
X/.../inc/
" auf. - Leiten Sie die Ausgabe in eine Datei mit dem Namen "
list
" um
Ich habe verschiedene Kombinationen des folgenden Befehls ohne Erfolg ausprobiert:
$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression
Wie kann ich das machen?
linux
command-line
find
iammilind
quelle
quelle
Hier ist ein praktischer Einzeiler:
Es läuft
find
auf jedem der erstenfind
Ergebnisse. Dieexec
Option kann auch einen minimalen Shell-Befehl annehmen, bei dem - wie gesagt -{}
jedes Verzeichnis des ersten ersetzt wirdfind
.Das zweite
find
wird gemäß Ihrer Anfrage "alle Unterverzeichnisse auflisten" der ersten Ergebnisse, einschließlich desinc
Verzeichnisses. Wenn Sie das selbst nicht in der Ausgabe haben möchten, lassen Sie den zweitenfind
mindestens Ordner mit der Tiefe 1 ausgeben.Wir werden dann nur der Befehl umleiten
stdout
inlist
.quelle
find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Okay, ich habe die Antwort gefunden, um diesen verschachtelten Fund zu simulieren:
quelle
find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list
( Begrenztgrep -z
auch das Nullzeichen, aber seine Ausgabe scheint ebenfalls durch Null getrennt zu sein, sodass man es z. B. durchleiten mussxargs -0L1 echo
, um es zeilenweise abzurufen ). In diesem Fall werden Zeilenumbrüche in Dateinamen weiterhin mehrdeutig dargestellt , da Sie die Liste mit jedem durch Zeilenumbrüche getrennten Eintrag in einer Datei speichern . Möglicherweise benötigen Sie nicht einmal die Zwischendatei, je nachdem, was Sie mit der Liste tun möchten.Versuche dies:
quelle
"\inc\"
-path
Flagge