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
Válasz
Gondolom, hogy ez csak az alkönyvtár szintjére vonatkozik. . **
/
nélkül egyezik
-
minden fájl és könyvtár
-
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
.
ɀ
?unicode ɀ
vagy Wikipédiaɀ
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: – )