2015-05-28 8 views
6

Wie würden Sie unter Verwendung eines ls –a und grep den Namen aller Dateien in/usr angeben, beginnend mit dem Buchstaben p oder dem Buchstaben r oder dem Buchstaben s mit einem einzigen Befehl?Verwenden von grep und ls -a Befehlen

wäre das richtig?

ls –a | grep [prs] /usr 
+0

Direkt unter '/ usr' oder auf irgendeiner Ebene unter'/usr'? –

+0

nur direkt unter/usr –

+0

'echo/usr/[prs] *' ... – twalberg

Antwort

4

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, dies tun suchen möchten:

find /usr -maxdepth 1 -name '[prs]*' 
+0

Sie listet Dateien auf, nicht finden sie (ich vermute, das ist eine Hausaufgabe). – Kusalananda

0

Ich würde ls das Verzeichnis und erst dann die grep gelten. Auch Sie fehlt den ^ Charakter heraus zu filtern nur die Dateien, die mit diesen Buchstaben beginnen :

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

vielen Dank für die Einsicht! –

0

Warum nicht einfach

find /usr -type f -name '[prs]*' 
+1

Denn das würde alles unter '/ usr' und nicht nur'/usr' selbst durchlaufen. – Kusalananda

+0

Das ist einfach mit einem '-maxdepth'-Argument behoben. Es ist sicherlich viel sicherer als das Parsen von 'ls'. –

3
ls -a /usr | grep '^[prs]' 

Würde wählen Sie aus der Ausgabe von ls -a /usr (das ist die Liste der Dateien in /usr, die durch Zeilenumbruchzeichen begrenzt sind) die Zeilen, die entweder mit p, r oderbeginnenZeichen.

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

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

-a ist versteckte Dateien, das heißt Dateien, deren Name mit . beginnt. Da Sie nur diejenigen wollen, die mit , q oder s beginnen, ist das überflüssig.

Beachten Sie, dass:

ls /usr | grep ^[pqs] 

noch falsch wäre. Erste ^ ist ein Sonderzeichen in einigen Shells wie die Bourne-Shell, rc, es oder zsh -o extendedglob (obwohl OK in bash oder andere POSIX-Shells).

Dann, in den meisten Shells (fish ist eine bemerkenswerte Ausnahme), [pqs] ist ein Globbing-Operator. Das bedeutet, dass ^[qps] durch die Shell auf die Liste der Dateien erweitert werden soll, die mit diesem Muster übereinstimmen (relativ zum aktuellen Verzeichnis).

So in diesen Schalen wie bash, die nicht ^ speziell behandeln, wenn es eine Datei ^p im aktuellen Verzeichnis genannt ist, die

ls /usr | grep ^p 

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

2

Der Kommentar von @twalberg ist perfekt für die Optionen, die Sie gefragt haben. Das Echo ignoriert versteckte Dateien, aber diese werden gefiltert, wenn Sie nur Dateien wollen, die mit [prs] beginnen.
Wenn Sie versteckte Dateien für andere Filter möchten, wäre eine ähnliche Lösung ls -ad /usr/[prs]*, wobei die Option -d die Auflistung der Unterverzeichnisse unterdrückt.
Diese Lösung zeigt auch den vollständigen Pfad, dies kann unterdrückt werden, wenn Sie zuerst zum Verzeichnis gehen. Wenn Sie in Ihrem aktuellen Verzeichnis bleiben möchten, verwenden Sie eine Subshell dafür. Ich benutze & & für das Überspringen der ls, wenn das Verzeichnis/usr nicht existiert.

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