Ik heb deze directory-structuur:
~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
en, met de globstar
optie ingeschakeld in Bash, ik kan zeggen:
~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
Mijn vraag is: waarom is dir/file.ext
uitgesloten van deze lijst?
Bash-handleiding zegt dit over globstar
:
Indien ingesteld, zal het patroon ** dat wordt gebruikt in een bestandsnaamuitbreidingscontext overeenkomen met alle bestanden en nul of meer mappen en submappen. Als het patroon wordt gevolgd door een /, komen alleen mappen en submappen overeen.
“ nul “in deze paragraaf laat me de indruk hebben dat dir/file.ext
had moeten worden opgenomen; tenzij ik hopelijk iets mis.
Reacties
Antwoord
Ik denk dat dat alleen verwijst naar het subdirectory-niveau . **
zonder /
overeenkomsten
-
alle bestanden en mappen
-
nul of meer submappen
Maar het verdwijnt niet helemaal. **/
betekent dat er geen bestanden in de directory op het hoogste niveau worden gevonden waarop **
van toepassing is.
Je hebt dir/*.ext dir/**/*.ext
.
Reacties
- Ja, dat is precies mijn terugval, het ziet er gewoon niet mooi uit. 😉
Answer
Dit werkt zoals je verwachtte in deze versies van Bash zoals geleverd met de vermelde distributies :
- 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
In feite zijn de bovenstaande versies alles wat ik heb getest. Met andere woorden: ik heb geen versie 4 van Bash gevonden waar het niet werkt. De optie globstar
is toegevoegd in Bash 4.0, zie WIJZIGINGEN . In oudere versies zou het commando shopt -s globstar
een fout moeten retourneren.
Tests
1 . dir/**/*.ext
komt overeen met dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
2. **/*.ext
komt overeen met file.ext
:
~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext
De omgeving voorbereiden voor het reproduceren van bovenstaande tests:
mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar
Reacties
- dit is de correct antwoord. Het OP vergat
shopt -s globstar
in te stellen.
Antwoord
I lijkt me alsof je globstar hebt / had uitgeschakeld. Het kan als volgt worden ingeschakeld:
shopt -s globstar
Het komt niet alleen niet overeen met nul submappen, maar het komt ook niet overeen met twee submappen:
$ 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
Met globstar uitgeschakeld, ** gedraagt zich uiteindelijk net als *, dus dir/**/*.ext
krijgt hetzelfde resultaat als dir/*/*.ext
$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
waardoor ik soms denk dat globstar aan staat
controleer je huidige globstar-instelling zoals this:
shopt | grep globstar
Reacties
- Je kunt een shell-optie-instelling direct controleren, zoals in
shopt globstar
.
ɀ
?unicode ɀ
of Wikipediaɀ
is slechts een teken dat hier wordt gebruikt om de prompt te onderscheiden. Sommige gebruikers geven de voorkeur aan het teken£
of€
in plaats van$
:). Oorspronkelijk wasɀ
een ' z ' teken gemaakt voor een speciale Afrikaanse taalnotatie: – )