Ez a könyvtárszerkezet van:

~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext 

és a A globstar opció engedélyezve van a Bash-ban, mondhatom:

~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

Kérdésem: miért van dir/file.ext kizárva a listából?

Bash kézikönyv ezt mondja a globstar:

Ha be van állítva, akkor a fájlnévkiterjesztési környezetben használt ** minta meg fog egyezni az összes fájllal és nulla vagy több könyvtárral és alkönyvtárral. Ha a mintát / követi, akkor csak a könyvtárak és az alkönyvtárak felelnek meg.

nulla ”ebben a bekezdésben azt a benyomást engedte nekem, hogy a dir/file.ext -t be kellett volna vonni; hacsak nem remélem, hogy hiányzik valami.

Megjegyzések

  • Mi ez a karakter? ɀ?
  • A bash melyik verziója, milyen platformon? ' Ezt nem tudom reprodukálni a Debh wheezy 4.2.37-es bash-jával vagy a Debian squeeze-n a 4.1.5-ös bash-val. @slm unicode ɀ vagy Wikipédia
  • @Gilles Ez egy gyors üzenet?
  • slm, igen! A ɀ csak egy karakter, amelyet itt használunk a prompt megkülönböztetésére. Egyes felhasználók a $ 🙂 helyett a £ vagy a karaktert részesítik előnyben. Eredetileg ɀ a ' z ' karakter készült egy speciális afrikai nyelvű jelöléshez: – )
  • " GNU bash, 3.2.53 (1) verzió – kiadás (x86_64-apple-darwin13) " az OS X 10.9 verzióval szállítva ez a viselkedés.

Válasz

Gondolom, hogy ez csak az alkönyvtár szintjére vonatkozik. . ** / nélkül egyezik

  1. minden fájl és könyvtár

  2. nulla vagy több alkönyvtár

De nem tűnik el teljesen. A **/ azt jelenti, hogy a legfelső szintű könyvtárban egyetlen fájl sem felel meg, amelyre ** vonatkozik.

Szüksége van dir/*.ext dir/**/*.ext.

Megjegyzések

  • Igen, pontosan ez az én tartalékom, csak nem néz ki szépen. 😉

Válasz

Ez a várt módon működik a Bash ezen verzióiban, a felsorolt disztribúciókkal együtt :

  • 4.1.2 (1) – CentOS 6.5
  • 4.1.5 (1) – Debian 6.0.10
  • 4.1.10 (4 ) – Cygwin 1.7.31
  • 4.2.46 (1) – CentOS 7.1
  • 4.3.11 (1) – Ubuntu 14.04.1
  • 4.3.30 (1) – Debian 8.1

Valójában a fent felsorolt verziókkal teszteltem. Más szavakkal, nem találtam a Bash 4. verzióját, ahol nem működne. A globstar opció hozzá lett adva a Bash 4.0-hoz, lásd: CHANGES . Régebbi verziókban a shopt -s globstar parancs hibát ad vissza.

Tesztek

1 . dir/**/*.ext egyezik dir/file.ext:

~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext 

2. **/*.ext egyezik a file.ext:

~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext 

A környezet előkészítése a fenti tesztek reprodukálásához:

mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar 

megjegyzések

  • ez az helyes válasz. Az operációs rendszer elfelejtette beállítani a shopt -s globstar beállítást.

Válasz

I úgy néz ki rám, mintha ki lett volna kapcsolva a globstar. A következő módon kapcsolható be:

shopt -s globstar 

Nem csak nulla alkönyvtárral, hanem két alkönyvtárral sem fog megfelelni:

$ find dir -type f #the same as yours except with a directory inside one of the subdirectories dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext $ shopt -u globstar #turn globstar off $ #will only show files in subdirectories $ #will not show files in dir or in subsubdir $ echo dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext $ shopt -s globstar #turn globstar on $ #will show all four files $ echo dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext 

Kikapcsolt globstar esetén a ** ugyanúgy viselkedik, mint *, így dir/**/*.ext ugyanazt az eredményt kapja, mint a dir/*/*.ext

$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

ami néha arra késztet, hogy a globstar be legyen kapcsolva

ellenőrizze a jelenlegi globstar beállítását, mint például ez:

shopt | grep globstar 

Megjegyzések

  • A shell opció beállításait közvetlenül ellenőrizheti, mint a shopt globstar.

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