ทุบตี globstar การจับคู่


18

ฉันมีโครงสร้างไดเรกทอรีนี้:

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

และด้วยglobstarตัวเลือกที่เปิดใช้งานใน Bash ฉันสามารถพูดได้:

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

คำถามของฉันคือ: ทำไมถูกdir/file.extแยกออกจากรายการนี้?

คู่มือทุบตีพูดถึงสิ่งนี้เกี่ยวกับglobstar:

หากตั้งค่ารูปแบบ '**' ที่ใช้ในบริบทการขยายชื่อไฟล์จะจับคู่ไฟล์ทั้งหมดและไม่มีค่าไดเรกทอรีและไดเรกทอรีย่อยหรือมากกว่า หากรูปแบบนั้นตามด้วย '/' จะมีเพียงไดเรกทอรีและไดเรกทอรีย่อยเท่านั้นที่ตรงกัน

ศูนย์ ” ในวรรคนี้ให้ฉันด้วยความประทับใจที่dir/file.extควรจะรวม; ถ้าฉันหวังว่าจะหายไปบางสิ่งบางอย่าง


2
ตัวละครนี้คืออะไร? ɀ?
slm

2
ทุบตีรุ่นใดบนแพลตฟอร์มใด ฉันไม่สามารถทำซ้ำด้วย bash 4.2.37 บน Debian wheezy หรือ bash 4.1.5 บน Debian squeeze @slm unicode ɀหรือWikipedia
Gilles 'SO- หยุดความชั่วร้าย'

1
@Gilles นั่นเป็นพรอมต์ใช่ไหม
slm

5
slm ใช่! ɀเป็นเพียงตัวละครที่ใช้ที่นี่เพื่อแยกแยะพรอมต์ ผู้ใช้บางคนชอบตัวละคร£หรือมากกว่า$:) เดิมทีɀอักขระ 'z' ถูกสร้างขึ้นสำหรับสัญลักษณ์ภาษาแอฟริกันพิเศษ :-)
Slyx

1
"GNU ทุบตีรุ่น 3.2.53 (1) - ปล่อย (x86_64-apple-darwin13)" มาพร้อมกับ OS X 10.9 มีพฤติกรรมนี้
natevw

คำตอบ:


8

ฉันเดาว่าหมายถึงระดับไดเรกทอรีย่อยเท่านั้น **ไม่มีการ/แข่งขัน

  1. ไฟล์และไดเรกทอรีทั้งหมด

  2. ไดเรกทอรีย่อยเป็นศูนย์หรือมากกว่านั้น

แต่มันก็ไม่หายสนิท **/หมายความว่าไม่มีไฟล์ในไดเรกทอรีระดับสูงสุดที่**ตรงกับที่ใช้

dir/*.ext dir/**/*.extคุณจำเป็นต้อง


ใช่นั่นคือทางเลือกของฉันมันดูไม่สวยเลย ;-)
Vlad GURDIGA

10

ใช้งานได้ตามที่คุณคาดหวังใน Bash เวอร์ชันเหล่านี้ซึ่งมาพร้อมกับการแจกแจงตามรายการ

  • 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) - เดเบียน 8.1

อันที่จริงแล้วรายการด้านบนเป็นสิ่งที่ฉันทำการทดสอบ กล่าวอีกนัยหนึ่งฉันไม่พบ Bash รุ่น 4 ที่ไม่สามารถใช้งานได้ ตัวเลือกที่globstarถูกเพิ่มเข้ามาในทุบตี 4.0 เห็นการเปลี่ยนแปลง ในเวอร์ชันที่เก่ากว่าคำสั่งshopt -s globstarควรส่งคืนข้อผิดพลาด

การทดสอบ

1. การ dir/**/*.extแข่งขันdir/file.ext:

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

2. การ **/*.extแข่งขันfile.ext:

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

การเตรียมสภาพแวดล้อมสำหรับการทำซ้ำการทดสอบข้างต้น:

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

2
นี่คือคำตอบที่ถูกต้อง shopt -s globstarสหกรณ์ลืมชุด
CS Pei

5

ฉันมองฉันเหมือนที่คุณมี / ปิด globstar สามารถเปิดได้เช่นนี้

shopt -s globstar

ไม่เพียง แต่จะไม่ตรงกับไดเรกทอรีย่อยเป็นศูนย์ แต่จะไม่ตรงกับไดเรกทอรีย่อยสองรายการ:

$ 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

เมื่อปิดการทำงานของ globstar ** จะมีพฤติกรรมเหมือน * ดังนั้นdir/**/*.extจะได้ผลลัพธ์เช่นเดียวกันdir/*/*.ext

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

ซึ่งบางครั้งก็หลอกให้ฉันคิดว่า globstar เปิดอยู่

ตรวจสอบการตั้งค่า globstar ปัจจุบันของคุณเช่นนี้:

shopt | grep globstar

1
shopt globstarคุณสามารถตรวจสอบเปลือกตัวเลือกการตั้งค่าได้โดยตรงในขณะที่
Benjamin W.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.