ฉันพยายามค้นหาXML
ไฟล์ทั้งหมดในไดเรกทอรีเฉพาะและไดเรกทอรีย่อยทั้งหมด (ซ้ำ) ที่อยู่ข้างใน
ls -R *.xml
เป็นเพียงรายชื่อไฟล์ในไดเรกทอรีปัจจุบัน ฉันค่อนข้างแน่ใจว่าโฟลเดอร์ย่อยเองมีหลาย.xml
ไฟล์ แต่ไม่มีใครแสดง
นี่เป็นปัญหาการกำหนดค่าหรือไม่?
ฉันพยายามค้นหาXML
ไฟล์ทั้งหมดในไดเรกทอรีเฉพาะและไดเรกทอรีย่อยทั้งหมด (ซ้ำ) ที่อยู่ข้างใน
ls -R *.xml
เป็นเพียงรายชื่อไฟล์ในไดเรกทอรีปัจจุบัน ฉันค่อนข้างแน่ใจว่าโฟลเดอร์ย่อยเองมีหลาย.xml
ไฟล์ แต่ไม่มีใครแสดง
นี่เป็นปัญหาการกำหนดค่าหรือไม่?
คำตอบ:
ลองใช้การค้นหา
sudo find . -print | grep -i '.*[.]xml'
find
มากกว่าls -R
?
find
และgrep
เมื่อfind
สามารถทำการกรองโดยใช้ทั้ง regexes และ globs และไม่ใช้find
's -print0
และ grep's -z
เมื่อคุณต้องการผสม
คุณสามารถทำได้ด้วยการค้นหาเท่านั้น:
find . -name '*.xml'
.
เป็นไดเรกทอรีปัจจุบัน หากคุณต้องการค้นหาในไดเรกทอรีอื่นแทนที่.
ด้วยเส้นทางไดเรกทอรี
.php
ไฟล์ในไดเรกทอรีปัจจุบัน แต่จะส่งคืนเฉพาะ.php
ไฟล์ในไดเรกทอรีปัจจุบันเท่านั้นไม่ได้ค้นหาซ้ำในไดเรกทอรีย่อย นั่นเป็นเหตุผลที่ฉันถามว่าfind
คำสั่งค้นหาซ้ำหรือไม่
find
คำสั่งค้นหาแบบวนซ้ำ หากคุณไม่อ้างอิงพารามิเตอร์ฉันคิดว่าเชลล์ของคุณอาจทำการขยายบน*
ดังนั้นมันจะจับคู่ไฟล์ในไดเรกทอรีปัจจุบัน
ลองคำสั่งนี้:
ls -R | grep '.*[.]xml'
ls
ไม่มีตัวเลือกในการกรองเอาต์พุต เพื่อที่คุณจะต้องใช้ท่อ สิ่งนี้จะส่งผ่านเอาต์พุตจากls
ไปยังgrep
ซึ่งจะกรอง.xml
ไฟล์เพื่อแสดงเฉพาะไฟล์
ls
?
การใช้globstar
ตัวเลือกเชลล์เราสามารถใช้การวนซ้ำแบบวนซ้ำได้./**/*
bash-4.3$ shopt -s globstar
bash-4.3$ for i in ./**/*.xml; do printf "%s\n" "$i" ; done
./adwaita-timed.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/META-INF/context.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/beans.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/web.xml
Perl มีโมดูลFind
ซึ่งอนุญาตให้ทราฟฟิกทรีไดเรกทอรีแบบเรียกซ้ำ ภายในfind()
ฟังก์ชั่นพิเศษเราสามารถกำหนดรูทีนย่อยที่ต้องการและไดเรกทอรีที่เราต้องการสำรวจในตัวอย่าง.
นี้ หนึ่งซับในกรณีดังกล่าวจะเป็น:
bash-4.3$ perl -le 'use File::Find; find(sub{-f && $_ =~ /.xml$/ && print $File::Find::name},".")'
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml
ในขณะที่ Perl มีทั้งโมดูลที่อุทิศให้กับทราเวิลทรีแบบเรียกซ้ำ Python มีฟังก์ชั่นที่เรียบร้อยwalk()
ซึ่งเป็นส่วนหนึ่งของos
โมดูล เราสามารถทำสิ่งต่อไปนี้:
bash-4.3$ python -c 'import os,sys; [ sys.stdout.write(os.path.join(r,i)+"\n") for r,s,f in os.walk(".") for i in f if i.endswith(".xml") ]'
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml
นี่อาจเป็นสิ่งที่ไกลเกินตัวเป็นสคริปต์:
#!/usr/bin/env python
import os,sys
for r,s,f in os.walk("."):
for i in f:
if i.endswith(".xml")
print(os.path.join(r,i))
คำตอบอื่น ๆ ที่กล่าวถึงfind
สำหรับการสำรวจเส้นทางแบบเรียกซ้ำและเป็นเครื่องมือไปสู่งาน สิ่งที่ต้องกล่าวถึงคือความจริงที่find
มีสวิตช์บรรทัดคำสั่งหลายตัวเช่น-printf
เพื่อพิมพ์เอาต์พุตในรูปแบบที่ต้องการ-type f
เพื่อค้นหาเฉพาะไฟล์ปกติ-inum
เพื่อค้นหาตามหมายเลข inode -mtime
เพื่อค้นหาตามวันที่แก้ไข-exec <command> {} \;
เพื่อดำเนินการคำสั่งเฉพาะเพื่อประมวลผลไฟล์ กับการส่งผ่านไฟล์เป็นอาร์กิวเมนต์ (ที่{}
เป็นมาตรฐานfind
ตัวยึดสำหรับไฟล์ปัจจุบัน) และอื่น ๆ อีกมากมายดังนั้นโปรดอ่าน manpage find
สำหรับ
ls -R | grep .xml