oikea tapa toistaa hakemiston sisältö [kaksoiskappale]

Tähän kysymykseen on jo annettu vastauksia :

Vastaa

Tarvitset vain luoda välilyönnillä eroteltu luettelo globaaleista vastaavista tiedostoista:

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

Muokkaa

Yllä oleva voi kirjoittaa uudestaan eri muodossa käyttämällä aaltosulkeutta

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

tai jopa lyhyempää : for file in {.,}*; do echo "$file"; done

Polun lisääminen valituille tiedostoille:

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

Polun lisääminen valituille tiedostoille tiedostot:

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

Jos haluat olla hienostunut ja poistaa luettelosta, yleensä tarpeettomat . ja

muuta vain {.,}* muotoon {..?,.[!.],}*.

Täydellisyyden vuoksi se kannattaa mainita, että dotglob voidaan asettaa myös vastaamaan dot-tiedostoja puhtailla *.

shopt -s dotglob 

Kohdassa zsh on lisäksi asetettava nullglob estämään virhe virheettömyydessä:

setopt nullglob 

tai vaihtoehtoisesti lisää glob-määrittelijä N malliin:

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

Kommentit

  • Kiitos paljon! Joten jos haluan toistaa minkä tahansa hakemiston, laitan vain hakemiston nimen jokaisen kohteen eteen, eikö? kuten for file in dir/.* dir/*; do
  • Se ' ei ole niin helppoa. .* vastaa . ja .. (paitsi zsh-muodossa). * pysyy *, jos vastaavaa tiedostoa ei ole. shopt -s gotglob on vain bash-versiossa.
  • Saan zsh: no matches found: .*, kun suoritan tässä vastauksessa olevat komennot. . Miksi näin tapahtuisi? Hakemiston ls näyttää tiedostot.
  • @Niyaz että ' s koska zsh palauttaa virheen, jos jokin kuvio ei Ottelut. Estää juoksu setopt nullglob, joka poistaa tämän ominaisuuden käytöstä globaalisti, tai lisää määritin (N) maailmantähden jälkeen, ts: for file in /path/{.,}*(N); do echo "$file"; done.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *