GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie führt man eine For-Each-Schleife über alle Dateien unter einem angegebenen Pfad aus?

Der for -loop iteriert über jeden (durch Leerzeichen getrennten) Eintrag in der angegebenen Zeichenfolge.

Sie führen den find nicht wirklich aus Befehl, aber geben Sie an, dass es sich um eine Zeichenfolge handelt (die von for iteriert wird -loop).Anstelle der doppelten Anführungszeichen verwenden Sie entweder Backticks oder $() :

for line in $(find . -iname '*.txt'); do 
     echo "$line"
     ls -l "$line"
done

Außerdem schlägt diese Methode fehl, wenn Ihre Dateipfade/-namen Leerzeichen enthalten (da die Datei for -loop iteriert über durch Leerzeichen getrennte Einträge). Stattdessen ist es besser, die in der Antwort von Dogbanes beschriebene Methode zu verwenden.

Um Ihren Fehler zu klären:

Wie gesagt, for line in "find . -iname '*.txt'"; iteriert über alle durch Leerzeichen getrennten Einträge, die sind:

  • finden
  • .
  • -iname
  • '*.txt' (glaube ich...)

Die ersten beiden führen nicht zu einem Fehler (abgesehen vom unerwünschten Verhalten), aber der dritte ist problematisch, da er ausgeführt wird:

ls -l -iname

Viele (Bash-)Befehle können einzelne Zeichenoptionen kombinieren, also -iname ist dasselbe wie -i -n -a -m -e . Und voila:Ihr invalid option -- 'e' Fehler!


Hier ist eine bessere Möglichkeit, Dateien zu durchlaufen, da Leerzeichen und Zeilenumbrüche in Dateinamen behandelt werden:

#!/bin/bash

find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
    echo "$line"
    ls -l "$line"    
done

Verwenden Sie die Befehlsersetzung anstelle von Anführungszeichen, um find auszuführen, anstatt den Befehl als Zeichenfolge zu übergeben:

for line in $(find . -iname '*.txt'); do 
     echo $line
     ls -l $line; 
done

Kompaktere Version, die mit Leerzeichen und Zeilenumbrüchen im Dateinamen arbeitet:

find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;

Linux
  1. So suchen Sie in der Konsole nach großen Dateien

  2. Wie kann man die Zeilen einer Datei durchlaufen?

  3. Wie finde ich alle Dateien, die sich auf eine Software beziehen?

  4. So verwenden Sie den Linux-Befehl find zum Suchen von Dateien

  5. So finden Sie alle Sparse-Dateien in Linux

So finden Sie Dateien in Linux mit dem Find-Befehl

So finden Sie Dateien über die Befehlszeile im Linux-Terminal

So finden Sie Dateien mit dem fd-Befehl in Linux

Wie ersetzt man ein Zeichen durch ein anderes in allen Dateinamen der aktuellen Verzeichnisse?

So führen Sie eine Grep-Suche für alle Dateien und in allen Verzeichnissen durch

Wie listet man alle Dateien einer Partition unter Linux auf?