ค้นหาด้วย -execdir


16

เมื่อฉันทำงานfindด้วย-execdirฉันไม่ได้รับผลลัพธ์ที่ฉันคาดหวัง

ตัวอย่างเช่น:

mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
├── b
   ├── c
   └── foo
└── foo

ไดเรกทอรีcไม่มีfooไฟล์ ฉันจะfindไปเยี่ยมชมและทำบางสิ่งในพื้นที่ในแต่ละไดเรกทอรีได้อย่างไร

คำตอบ:


18

สำหรับทุกไฟล์ที่ตรงกัน (เช่นทุกไดเรกทอรี) ให้findสลับไปยังไดเรกทอรีที่มี (เช่นไดเรกทอรีหลัก) และดำเนินการคำสั่งที่ระบุ เนื่องจากคำสั่งไม่ได้ใช้ชื่อของการจับคู่มันจะไม่ดำเนินการกับไดเรกทอรีทั้งหมด สำหรับทรีไดเรกทอรีเฉพาะนี้คุณกำลังทำ

(cd . && touch foo)        # because ./a matches
(cd ./a && touch foo)      # because ./a/b matches
(cd ./a/b && touch foo)    # because ./a/b/c matches

ในการสร้างไฟล์ในทุก ๆ ไดเรกทอรีคุณสามารถใช้-execแทน-execdirได้หากคุณfindสามารถอนุญาตให้{}มีการโต้แย้งได้

find . -type d -exec touch {}/foo +

สำหรับการพกพา POSIX คุณจะต้องทำการรวบรวมชื่อไดเรกทอรีและชื่อฐานไฟล์ด้วยตนเอง

find . -type d -exec sh -c 'touch "$0/foo"' {} \;

หรือ (เร็วขึ้นเล็กน้อย)

find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +

หรือคุณสามารถใช้การจับคู่สัญลักษณ์ซ้ำของ bash ระวังว่า (ไม่เหมือนกับฟีเจอร์ที่เกี่ยวข้องใน ksh และ zsh และไม่เหมือนกับfindคำสั่งของคุณ) bash เกิดขึ้นซ้ำภายใต้ลิงก์สัญลักษณ์ไปยังไดเร็กทอรี

shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done

โซลูชัน zsh:

touch ./**/(e\''REPLY+=foo'\')

FYI: man bashสถานะภายใต้ "-c": อาร์กิวเมนต์หลังจาก command_string ถูกกำหนดให้กับพารามิเตอร์ตำแหน่งที่เริ่มต้นด้วย $ 0 อย่างไรก็ตาม "for d" จะวนซ้ำผ่านพารามิเตอร์ตำแหน่งที่เริ่มต้นด้วย $ 1 "_" เป็นข้อความที่กำหนดให้กับ $ 0 และจะไม่ถูกใช้
ชาด Skeeters

3

คำสั่งดำเนินการในทุกไดเรกทอรีที่มีไฟล์ที่ตรงกัน เนื่องจากcไม่มีไดเรกทอรีจึงไม่ตรงกันและจะไม่สามารถทำงานได้

ทางออกคือการเพิ่มชื่อไดเรกทอรีไปยังอาร์กิวเมนต์ execdir เช่น:

find . -type d -execdir touch {}/foo \;

2

จาก man file

   -execdir command {} +
          Like  -exec,  but  the  specified  command is run from the subdirectory containing the matched file

ไดเรกทอรีที่ตรงกันของคุณcอาศัยอยู่ในbไดเรกทอรีเพื่อที่จะเรียกใช้ exec มันจะทำงานได้ตามที่คุณคาดหวังหากคุณกำลังมองหาไฟล์แทนไดเรกทอรี

คุณอาจจะบรรลุสิ่งที่คุณต้องการโดยส่งไดเรกทอรีไปxargsตามที่จะได้รับรายชื่อเต็มของไดเรกทอรี

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