it-swarm.com.de

Verwenden Sie die Befehle grep und ls -a

Wie würden Sie mit ls –a und grep den Namen aller Dateien in/usr auflisten, beginnend mit dem Buchstaben p oder dem Buchstaben r oder den Buchstaben s mit einem einzigen grep-Befehl? 

wäre das richtig?

ls –a | grep [prs] /usr
6
Nicole Romain

Wenn Sie versuchen, Dateien zu finden, verwenden Sie nicht ls. Verwenden Sie den Befehl find.

find /usr -name '[prs]*'

Wenn Sie nicht den gesamten Baum unter/usr durchsuchen möchten, gehen Sie folgendermaßen vor:

find /usr -maxdepth 1 -name '[prs]*'
4
Andy Lester
 ls -a /usr | grep '^[prs]'

Wählen Sie aus der Ausgabe von ls -a /usr (dh der Liste der Dateien in /usr, die durch Zeilenumbrüche getrennt sind) die Zeilen aus, die mit einem der Zeichen p, r oder s beginnen.

Das erwartet Ihr Lehrer wahrscheinlich, aber er ist falsch oder zumindest nicht zuverlässig.

Dateinamen können aus vielen Zeilen bestehen, da das Zeilenvorschubzeichen ein beliebiges Zeichen ist wie ein Dateiname unter Linux oder Unix. Dieser Befehl gibt also nicht die Dateien zurück, deren Name mit p, q oder s beginnt, sondern die Zeilen der Dateinamen, die mit p, q oder s beginnen. Im Allgemeinen können Sie die Ausgabe von ls nicht zuverlässig nachbearbeiten.

-a enthält versteckte Dateien, dh Dateien, deren Name mit . beginnt. Da Sie nur diejenigen haben wollen, die mit p, q oder s beginnen, ist dies überflüssig.

Beachten Sie, dass:

ls /usr | grep ^[pqs]

wäre noch falscher. Zuerst ist ^ ein Sonderzeichen in einigen Shells wie der Bourne-Shell, rc, es oder zsh -o extendedglob (obwohl in bash oder anderen POSIX-Shells OK).

In den meisten Shells (fish ist dies eine bemerkenswerte Ausnahme), ist [pqs] ein Globbing-Operator. Das bedeutet, dass ^[qps] von der Shell auf die Liste der Dateien erweitert werden soll, die diesem Muster entsprechen (relativ zum aktuellen Verzeichnis).

In solchen Shells wie bash, die ^ nicht speziell behandeln, wird dies zu einer Datei mit dem Namen ^p im aktuellen Verzeichnis

ls /usr | grep ^p

Wenn keine passende Datei in csh, tcsh, zsh oder bash -O failglob vorhanden ist, erhalten Sie eine Fehlermeldung und der Befehl wird abgebrochen. In zsh -o extendedglob, wo ^ ein Globbing-Operator ist, würde ^[pqs] jede Datei außer p, q oder s bedeuten.

4

Der Kommentar von @twalberg ist perfekt für die von Ihnen gewünschten Optionen. Das Echo ignoriert verborgene Dateien, diese werden jedoch gefiltert, wenn Sie nur Dateien mit [prs] beginnen möchten.
Wenn Sie versteckte Dateien für andere Filter wünschen, ist ls -ad /usr/[prs]* eine ähnliche Lösung, bei der die Option -d die Auflistung der Unterverzeichnisse unterdrückt.
Diese Lösung wird auch den vollständigen Pfad anzeigen. Dies kann unterdrückt werden, wenn Sie zuerst in das Verzeichnis gehen. Wenn Sie in Ihrem aktuellen Verzeichnis bleiben möchten, verwenden Sie eine Subshell. Ich verwende && zum Überspringen des ls, wenn das Verzeichnis/usr nicht existiert.

(cd /usr && ls -ad [prs]*)
2
Walter A

Ich ls das Verzeichnis und wende erst dann die grep an. Außerdem fehlt Ihnen das Zeichen ^, um nur die Dateien herauszufiltern, die start mit diesen Buchstaben enthalten:

$ ls -a /usr | grep ^[prs]
0
Mureinik

Warum nicht gerade?

 find /usr -type f -name '[prs]*'
0
Mithrandir