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