Einfache Frage, ich führe den folgenden Suchbefehl aus:
find . -type d \( -path ./.git -o \
-path ./log -o \
-path ./public -o \
-path ./tmp \) \
-prune -o \
-print
Zum Auflisten aller Dateien in meinem Verzeichnis mit Ausnahme der angegebenen Verzeichnisse.
Dies funktioniert jedoch hervorragend. Ich möchte jedoch auch alle tatsächlichen Verzeichnisse von der Ausgabe ausschließen. Wenn also eine Verzeichnisstruktur wie folgt vorhanden ist:
test
-- foo.text
-- bar.text
Wenn ich meinen Befehl ausführe, würde ich gerne sehen:
./test/foo.text
./test/bar.text
anstatt:
.
./test
./test/foo.text
./test/bar.text
Kann jemand helfen?
linux
find
search
file-search
TheDelChop
quelle
quelle
Antworten:
werde es tun. Sie können exec ausführen, wenn Sie Dateinamen bearbeiten möchten.
quelle
-type f
ist für reguläre Dateien. Verzeichnisse und reguläre Dateien sind zwei von vielen verschiedenen Dateitypen unter Unix. Mit schließen-type f
Sie Verzeichnisse aus, aber auch alle anderen Dateitypen wie Symlinks, Sockets, Fifos, Geräte, Türen ...Verwenden Sie einfach
! -type d
:quelle
Hier ist eine Möglichkeit, dies zu tun. Ich leite deine Ausgabe von
find
(usingxargs
) an ein bisschen Bash weiter, was die Frage stellt: "Ist das kein Verzeichnis?" Wenn dies nicht der Fall ist, wird es an Ihr Terminal weitergeleitet.Hier ist die ganze She-Bang:
find . -type d \( -path ./.git -o -path ./log -o -path ./public -o -path ./tmp \) -prune -o -print | xargs -i bash -c 'if [ ! -d "{}" ]; then echo "{}"; fi'
Hier ist nur meine Ergänzung:
xargs -i bash -c 'if [ ! -d "{}" ]; then echo "{}"; fi'
Erklären:
xargs -i
Ersetzen Sie die Zeichenfolge "{}" durch Argumente (die eingespeist werden).bash -c
Befehle aus Zeichenfolge lesenif [ ! -d "{}"];
Ist das ein Verzeichnis?echo "{}"
Echo das Suchergebnis.fi;
beenden, wenn.quelle
$(do-what-I-want)
zum Beispiel aufgerufen wird , damit Sie tun, was er will.