วิธีการแยกไดเรกทอรีย่อยของไดเร็กทอรีเฉพาะจากคำสั่ง find?

Aug 15 2020

ฉันกำลังพยายามหารายการไฟล์ที่ฉันสามารถไปป์เพื่อ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ได้ แต่ปัญหาคือนี่เป็นส่วนยกเว้นของคำสั่งที่ใหญ่กว่าและไม่ได้ผลเมื่อฉันรันคำสั่งแบบเต็ม เป็นไปได้ฉันอาจต้องยกเว้นไดเรกทอรีย่อยที่เฉพาะเจาะจงรวมทั้งไดเรกทอรีย่อยในไดเรกทอรีย่อยอื่น ๆ

คำตอบ

jeremysprofile Aug 16 2020 at 01:10

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

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
2 root Aug 16 2020 at 01:13

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

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นิพจน์