GNU/Linux >> Znalost Linux >  >> Linux

Jak provést smyčku pro každého přes všechny soubory pod zadanou cestou?

for -loop bude iterovat přes každý záznam (oddělený mezerou) na zadaném řetězci.

Ve skutečnosti nespustíte find příkaz, ale poskytněte jej jako řetězec (který se iteruje pomocí for -loop).Namísto dvojitých uvozovek použijte buď zpětné zaškrtnutí nebo $() :

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

Navíc, pokud cesty/názvy souborů obsahují mezery, tato metoda selže (protože for -loop iteruje přes položky oddělené mezerou). Místo toho je lepší použít metodu popsanou v odpovědi dogbanes.

Pro objasnění vaší chyby:

Jak bylo řečeno, for line in "find . -iname '*.txt'"; iteruje přes všechny položky oddělené mezerou, což jsou:

  • najít
  • .
  • -jméno
  • '*.txt' (myslím...)

První dvě nevedou k chybě (kromě nežádoucího chování), ale třetí je problematická, protože se provádí:

ls -l -iname

Mnoho (bash) příkazů může kombinovat volby jednoho znaku, takže -iname je stejný jako -i -n -a -m -e . A voila:vaše invalid option -- 'e' chyba!


Zde je lepší způsob, jak procházet soubory, protože zpracovává mezery a nové řádky v názvech souborů:

#!/bin/bash

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

Použijte nahrazení příkazu místo uvozovek k provedení find namísto předání příkazu jako řetězce:

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

Kompaktnější verze pracující s mezerami a novými řádky v názvu souboru:

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

Linux
  1. Jak zkontrolovat velké soubory v konzole

  2. Jak procházet řádky souboru?

  3. Jak nahradit jeden znak druhým ve všech názvech souborů aktuálních adresářů?

  1. Jak najít všechny soubory související se softwarem?

  2. Jak používat Linuxový příkaz find k hledání souborů

  3. Jak smyčkovat adresáře v Linuxu?

  1. Jak najít největší adresáře nebo největší soubory?

  2. Jak najdu všechny pevné odkazy na souborovém systému?

  3. Jak zrušit propojení všech symbolických odkazů v adresáři?