จะแยกไดเรกทอรีย่อยของไดเรกทอรีเฉพาะออกจากคำสั่ง find ได้อย่างไร

ฉันกำลังพยายามรับรายการไฟล์ที่ฉันสามารถไพพ์ไปที่ wc -l เพื่อรับจำนวนคำของไฟล์ทั้งหมด (ไม่ได้ใช้ wc โดยตรงดังนั้นฉันจึงสามารถกรองรายการไฟล์ก่อนใช้คำสั่ง)

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

- folder
   - file.php
   - file2.html
   - file3.php
   - folder1
   - folder2a
   - folder3b
   - folder4
- file.php
- file2.php

ฉันต้องการแยกไดเร็กทอรีบางตัวใน find ของฉัน ซึ่งส่วนใหญ่เป็นไลบรารีและสิ่งอื่น ๆ ที่ฉันไม่ได้สร้าง ฉันสามารถทำได้ด้วยตนเองดังนี้:

find /var/www/html/ -type f -not -path "/var/www/html/folder/folder1" -not -path "/var/www/html/folder/folder2a" ฯลฯ

อย่างไรก็ตาม การระบุโฟลเดอร์ทั้งหมดอย่างชัดเจนเป็นเรื่องน่ารำคาญ และรายการสามารถเปลี่ยนแปลงได้ทุกเมื่อเช่นกัน ฉันได้ลองใช้ /* และ /** เพื่อจับคู่รูปแบบ แต่ก็ไม่ได้ผลเช่นกัน มีวิธีสำหรับหนึ่งในคำสั่ง not ในคำสั่ง find ของฉันที่ฉันสามารถแยกไดเรกทอรีย่อยทั้งหมดของไดเรกทอรีใดไดเรกทอรีหนึ่งได้ แต่ ไม่ แยกไดเรกทอรีนั้นเองหรือไม่ (รวมไฟล์ในไดเรกทอรีนั้นด้วย) แต่ไม่มีไดเรกทอรีย่อยใด ๆ)?

ต่อไปนี้เป็นการเดาตามสัญชาตญาณ:

find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)

แต่ถึงแม้ find จะบ่นเกี่ยวกับเรื่องนี้:

find: warning: you have specified the -maxdepth option after a non-option argument -not, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.

ดูเหมือนว่า maxdepth จะไม่สามารถรวมในการดำเนินการได้

มีการถามตอบมากมายเกี่ยวกับการยกเว้นไดเร็กทอรีย่อยเฉพาะ แต่ไม่ใช่ไดเร็กทอรีย่อยทั่วไปในไดเร็กทอรีย่อยเฉพาะ

ฉันสามารถทำให้มันทำงานในไดเร็กทอรีเดียวด้วย -maxdepth 1 ได้ แต่ปัญหาคือนี่เป็นส่วนหนึ่งของคำสั่งที่ใหญ่กว่า และนั่นไม่ทำงานเมื่อฉันรันคำสั่งแบบเต็ม อาจเป็นไปได้ว่าฉันอาจจำเป็นต้องยกเว้นไดเรกทอรีย่อยที่เฉพาะเจาะจงรวมถึงไดเรกทอรีย่อยใดๆ ในไดเรกทอรีย่อยเฉพาะอื่นๆ หลายรายการ


person InterLinked    schedule 16.08.2020    source แหล่งที่มา


คำตอบ (2)


เพียงแค่ค้นหา:

find /var/www/html -type f -not -path '/var/www/html/folder/*/*'

คำตอบเดิม:

แฮ็คหนึ่งครั้งอาจเป็น grep -v ในผลลัพธ์ของ find:

find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
person jeremysprofile    schedule 16.08.2020
comment
นี่มันสมบูรณ์แบบ! ฉันแค่ต้องเพิ่ม xargs ก่อน wc และมันเป็นไปตามที่ฉันกำลังมองหา ฉันคิดว่าฉันสามารถไพพ์ได้หลายครั้ง หนึ่งครั้งสำหรับแต่ละโฟลเดอร์ที่มีไดเร็กทอรีย่อยที่ต้องแยกออก และไม่รวมไดเร็กทอรีย่อยอื่น ๆ โดยเป็นส่วนหนึ่งของการค้นหา - person InterLinked; 16.08.2020

สมมติว่าคุณกำลังมองหาไฟล์โดยเฉพาะ (เช่น ไม่ใช่ไดเร็กทอรี):

find /var/www/html -type f -not -path "/var/www/html/folder/*/*"

นั่นเป็นเพราะว่า:

  • ไฟล์ที่อยู่ภายใต้ /var/www/html/folder โดยตรงไม่ใช่ไดเรกทอรี ดังนั้นจึงไม่ตรงกับส่วนคำสั่ง -path
  • ไดเรกทอรีภายใต้ /var/www/html/folder โดยตรงไม่ตรงกับ -type f
  • ไฟล์ภายใต้ไดเร็กทอรีย่อยของ /var/www/html/folder จะต้องมี / พิเศษในพาธ ดังนั้นไฟล์เหล่านั้นจึงตรงกับนิพจน์ -path
person root    schedule 16.08.2020
comment
คุณพูดถูก ฉันยังไม่ได้ทดสอบกรณีนี้ แก้ไขคำตอบแล้ว - person root; 16.08.2020