Befehl ls | grep zeigt nur Verzeichnisse an (obwohl auch Dateien angezeigt werden sollten)

Befehl ls | grep zeigt nur Verzeichnisse an (obwohl auch Dateien angezeigt werden sollten)

Unter Linux habe ich eine Datei, die unter anderem viele Dateien und Verzeichnisse enthält, die wörtlich „Scrap“ enthalten. Ich kann sie ls *scrap*problemlos durch Eintippen sehen. Allerdings werden dadurch auch Verzeichnisse zurückgegeben, die wörtlich „Scrap“ enthalten, und diese möchte ich ausschließen.

ls | grep ".*scrap.*"Ich habe versucht, mit oder herumzuspielen, ls | grep scrapaber dies gibt nur die Verzeichnisse zurück (nicht die normalen Dateien).

Warum ist das so?

Der nächste Schritt besteht darin (sobald der Mitarbeiter die korrekte Ausgabe zurückgibt), die Verzeichnisse aus dieser Ausgabe zu entfernen. Vorschläge dazu sind ebenfalls willkommen!

Antwort1

scrapTatsächlich benötigen Sie ls+ nicht , um schließlich alle regulären Dateien im aktuellen Verzeichnis (auf der 1. Ebene) aufzulisten, die in ihrem Namen enthalten sind grep.

Mit altem GutenfindBefehl:

find . -maxdepth 1 -type f -name "*scrap*" -ls

Antwort2

Sie bekommen Probleme, lswenn grepDateinamen Leerzeichen oder (schlimmer noch) Zeilenumbrüche enthalten. Aber mit sicheren Dateinamen können Sie Folgendes tun:

ls -l | grep -oP '^-.* \K.*$'
ls -l | sed -n '/^-/s/^.* //p'

Normalerweise sollten Sie diesen findAnsatz jedoch verwenden.

Antwort3

Für die Namen der Nicht-Verzeichnisdateien im aktuellen Verzeichnis, die enthalten scrap, in zsh:

print -rC1 -- *scrap*(ND^/)

Beachten Sie, dass in ls *scrap*(oder korrekter ls -- *scrap*), wenn eine der *scrap*Dateien vom TypVerzeichnis, dann lswerden ihreInhalt(mit einem that-scrap-dir:Header, sofern es nicht *scrap*in eine und nur eine Datei erweitert wird, nämlich dieses Verzeichnis).

Wenn Sie das für Dateien vom TypVerzeichnis, lsdruckt einfach ihren Namen wie für andere Dateitypen, Sie müssen die -dOption hinzufügen:

ls -d -- *scap*(D^/)

Es ergibt jedoch kaum einen Sinn, lsdie Dateien nach Namen und Typ zu suchen, da die Shell zum Zeitpunkt des Aufrufs die ganze Arbeit bereits erledigt hat ls. Sie können also genauso gut die integrierten Funktionen printoder printfIhrer Shell verwenden.

Antwort4

Sieht aus als obDasist die Antwort, nach der Sie suchen. Der Beitrag spricht davon, dass die Glob-Expansion der Grund dafür ist, dass nur bestimmte Dinge angezeigt werden.

verwandte Informationen