a könyvtár tartalmának iterációjának megfelelő módja [duplicate]

A kérdésre itt már vannak válaszok :

Válasz

Csak szüksége van a globális fájlok listájának létrehozásához szóközzel elválasztva:

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

Szerkesztés

A fentiek különböző formában írhatók át a zárójel kiterjesztésével

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

vagy még rövidebben : for file in {.,}*; do echo "$file"; done

Útvonal hozzáadása a kijelölt fájlokhoz:

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

Útvonal hozzáadása a kijelölt fájlokhoz fájlok:

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

Ha kifinomultabbá akarsz válni és törlöd a listáról, általában szükségtelen . és

csak változtassa meg a {.,}* értéket {..?,.[!.],}* -re.

A teljesség érdekében érdemes megemlítve, hogy a dotglob beállítható úgy is, hogy a dot-fájlok tiszta * -hez illeszkedjenek.

shopt -s dotglob 

A zsh fájlban a nullglob -t be kell állítani, hogy megakadályozzák a hibát nem egyezés esetén:

setopt nullglob 

vagy alternatív megoldásként adja hozzá a glob osztályozót N a mintához:

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

Megjegyzések

  • Nagyon köszönöm! Tehát, ha bármelyik könyvtárban szeretnék iterálni, csak a könyvtár nevét teszem az egyes elemek elé? mint a for file in dir/.* dir/*; do
  • Ez nem olyan könnyű. ' A .* egyezik a . és a .. (zsh kivételével). * marad *, ha nincs megfelelő fájl. A shopt -s gotglob csak bash-ban van.
  • zsh: no matches found: .* -et kapok, amikor futtatom a parancs (oka) t ebben a válaszban . Miért történne ez? A könyvtárban található fájlok a fájlokat mutatják.
  • @Niyaz, amely ' azért van, mert zsh hibát ad vissza, ha valamilyen minta nem mérkőzések. Az setopt nullglob futtatás megakadályozása érdekében, amely globálisan kikapcsolja ezt a funkciót, vagy adjon hozzá egy (N) minősítőt a globális csillag után, azaz: for file in /path/{.,}*(N); do echo "$file"; done.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük