správný způsob iterace obsahu v adresáři [duplicate]

Tato otázka již má odpovědi zde :

Odpověď

Musíte pouze pro vytvoření seznamu glob vyhovujících souborů oddělených mezerou:

for file in .* *; do echo "$file"; done 

Upravit

Výše uvedený lze přepsat v jiné formě pomocí rozšíření složené závorky

 for file in {.*,*}; do echo "$file"; done 

nebo dokonce kratší : for file in {.,}*; do echo "$file"; done

Přidání cesty pro vybrané soubory:

 for file in /path/{..?,.[!.],}*; do echo "$file"; done 

Přidání cesty pro vybrané soubory:

 for file in /path/{.,}*; do echo "$file"; done 

Pokud chcete být propracovaní a odstranit ze seznamu obvykle nepotřebné . a

stačí změnit {.,}* na {..?,.[!.],}*.

Pro úplnost stojí za to za zmínku, že lze také nastavit dotglob tak, aby odpovídal dot-souborům s čistými *.

shopt -s dotglob 

V zsh je třeba dodatečně nastavit nullglob, aby se zabránilo chybě v případě nesouladu:

setopt nullglob 

nebo alternativně přidejte do vzoru kvalifikátor glob N:

for file in /path/{.,}*(N); do echo "$file"; done 

Komentáře

  • Mnohokrát děkujeme! Takže pokud chci iterovat přes libovolný adresář, vložím název adresáře před každou z položek správně? jako for file in dir/.* dir/*; do
  • ' to není tak snadné. .* odpovídá . a .. (kromě zsh). * zůstane *, pokud neexistuje odpovídající soubor. shopt -s gotglob je pouze v bash.
  • Zobrazuje se mi zsh: no matches found: .*, když v této odpovědi spustím příkaz (y) . Proč by se to stalo? Soubor v adresáři zobrazuje soubory.
  • @Niyaz, že ' je to proto, že zsh vrátí chybu, pokud nějaký vzor ne zápasy. Chcete-li tomu zabránit, spusťte setopt nullglob, který tuto funkci globálně vypne, nebo přidejte kvalifikátor (N) za globální hvězdu, tj .: for file in /path/{.,}*(N); do echo "$file"; done.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *