ubuntuusers.de

bash: ls -R *.txt funktioniert nicht?

Status: Gelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

FragNet

Anmeldungsdatum:
28. September 2014

Beiträge: 15

Gude, ich möchte mit ls -R *.txt rekursiv alle Dateien mit der Endung .txt ausgeben, leider funtioniert das nicht. Hat jemand einen Tip wie ich das Kommando richtig eingeben muss?

Vielen Dank!

Mooi

Anmeldungsdatum:
15. August 2014

Beiträge: 187

Dafür würde ich find benutzen:

find -type f -name "*.txt"

MPW

Anmeldungsdatum:
4. Januar 2009

Beiträge: 3731

Hallo und Herzlich Willkommen im Forum,

die Eingabe *.txt am Ende ist kein Pattern, sondern wird schon von Bash interpretiert und dort nur auf alle Dateien im aktuellen Ordner bezogen. Das sieht man z.B. in der man ls:

SYNOPSIS
       ls [OPTION]... [FILE]...

Für rekursive Suchen verwendet man besser find:

find . -name '*.txt'

Wenn es umbedingt ls sein soll, ginge es so:

ls *|grep '.txt'

Grüße MPW

tomtomtom Team-Icon

Supporter
Avatar von tomtomtom

Anmeldungsdatum:
22. August 2008

Beiträge: 55439

Wohnort: Berlin

Mit ls wäre das wohl

ls -R |grep .txt

Das zeigt aber nur die Dateien, nicht die Pfade. Falls das benötigt wird, wären z.B. find oder tree besser geeignet.

find -name "*.txt"
tree -f| grep .txt

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

In der bash kann es auch mit ls machen, wenn man die Shelloption "globstar" setzt:

$ shopt -s globstar
$ ls **/*.txt 

Bei der zsh funktioniert es standardmäßig mit diesem Muster. Die "**" matchen beliebig viele Verzeichnisse.

Ich nehme allerdings auch meist find, weil man da die Ergebnisse noch genauer steuern kann und es mir schneller vorkommt.

FragNet

(Themenstarter)

Anmeldungsdatum:
28. September 2014

Beiträge: 15

erstmal vielen Dank für eure Kommentare! Ich nehme jetzt ls -Rl | grep '\.txt' Nun möchte ich aber noch eine Zeichenkette auschließen die zwar mit *.txt gefunden wird, die ich aber zur Auswertung nicht brauche. Wie geht das denn mit grep?

FragNet

(Themenstarter)

Anmeldungsdatum:
28. September 2014

Beiträge: 15

Ok, ich habs! Zusätzlich filter ich noch alle Ordner raus.

ls -lR ~/Videos 2>/dev/null | grep '\.ts' | grep -v '@eaDir' | grep -v 'drwxr-x-–'

Viel Spaß noch!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

FragNet schrieb:

Ok, ich habs!

Nee.

Zusätzlich filter ich noch alle Ordner raus.

ls -lR ~/Videos 2>/dev/null | grep '\.ts' | grep -v '@eaDir' | grep -v 'drwxr-x-–'

Das geht viel einfacher und vor allem verlässlicher (Dein "keine Directories"-grep geht schief, sobald ein Verzeichnis andere Rechte hat, Dein ts-grep geht schief, wenn ein Objekt die Folge ".ts" mitten im Namen hat usw.) mit

1
find ! -type d -name '*.ts' ! -name '*@eaDir*'

Wobei vermutlich dieses das tut, was Du brauchst:

1
find -type f -name '*.ts'

Ciao

robert

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Und wenn Du ein andermal mehrere Suchmuster ausschließen willst, dann nimm egrep mit (Gruppe und Oder):

1
egrep -V "(lila|rot|pink)"

FragNet

(Themenstarter)

Anmeldungsdatum:
28. September 2014

Beiträge: 15

Ok, Leute. Ich habe den Befehl nochmal nach euren Empfehlungen verbessert. Nun werden alle Dateien mit der Endung *.ts die sich im Verzeichnis und Unterverseichnissen befinden, nach Dateigröße sortiert und ausgegeben. Gehts noch einfacher oder besser?

1
ls -sR ~/Videos 2>/dev/null | grep '\.ts' | egrep -v '(@eaDir|drwxr-x---)' | sort -n

Bearbeitet von rklm:

Syntaxhighlighting hinzugefügt. Bitte mache Dich mit der Funktionalität des Forums vertraut!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

FragNet schrieb:

Ok, Leute. Ich habe den Befehl nochmal nach euren Empfehlungen verbessert.

Nur unwesentlich.

Gehts noch einfacher oder besser?

Siehe oben. Wieso fragst Du eigentlich, wenn Du die Hinweise weitestgehend ignorierst?

user unknown schrieb:

Und wenn Du ein andermal mehrere Suchmuster ausschließen willst, dann nimm egrep mit (Gruppe und Oder):

👍

1
egrep -V "(lila|rot|pink)"

Du meinstest "-v" (klein geschrieben). In diesem Fall sind die Klammern nicht nötig.

Bis neulich

robert

FragNet

(Themenstarter)

Anmeldungsdatum:
28. September 2014

Beiträge: 15

rklm schrieb:

Du meinstest "-v" (klein geschrieben). In diesem Fall sind die Klammern nicht nötig.

Richtig, ohne Klammern gehts auch ☺ Hmm, -V (groß geschrieben) gibt doch lediglich die Versionsnr. von grep aus?

FragNet

(Themenstarter)

Anmeldungsdatum:
28. September 2014

Beiträge: 15

find ! -type d -name '*.ts' ! -name '*@eaDir*'

Ist auch eine schöne Variante aber leider ohne Ausgabe der Dateigröße und die brauche ich zwingend zum sortieren.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

FragNet schrieb:

find ! -type d -name '*.ts' ! -name '*@eaDir*'

Ist auch eine schöne Variante aber leider ohne Ausgabe der Dateigröße und die brauche ich zwingend zum sortieren.

Ach, das war das Ziel der Aktion?

1
find ! -type d -name '*.ts' ! -name '*@eaDir*' -printf '%s %p\n' | sort -n

Aber ich denke, Du brauchst nur

1
find -type f -name '*.ts' -printf '%s %p\n' | sort -n

Die Manpage von find sagt Dir, was Du noch alles ausgeben kannst.

Ein genereller Tipp: Richtig fragen hilft Dir, bessere Antworten zu bekommen.

Ciao

robert

FragNet

(Themenstarter)

Anmeldungsdatum:
28. September 2014

Beiträge: 15

rklm schrieb:

Die Manpage von find sagt Dir, was Du noch alles ausgeben kannst.

Ein genereller Tipp: Richtig fragen hilft Dir, bessere Antworten zu bekommen.

Ich werds mir merken!!!!☺ "Find" ist die bessere Variante, vielen Dank!

Antworten |