วิธีค้นหาไฟล์ซ้ำ ๆ ในไดเรกทอรีย่อย


117

ฉันพยายามค้นหาXMLไฟล์ทั้งหมดในไดเรกทอรีเฉพาะและไดเรกทอรีย่อยทั้งหมด (ซ้ำ) ที่อยู่ข้างใน

ls -R *.xmlเป็นเพียงรายชื่อไฟล์ในไดเรกทอรีปัจจุบัน ฉันค่อนข้างแน่ใจว่าโฟลเดอร์ย่อยเองมีหลาย.xmlไฟล์ แต่ไม่มีใครแสดง

นี่เป็นปัญหาการกำหนดค่าหรือไม่?


2
คุณสามารถทำได้ls -R | grep .xml
นิโคส

คำตอบ:


90

ลองใช้การค้นหา

sudo find . -print | grep -i '.*[.]xml'

4
sudo จะต้องทำหรือมีเพื่อให้แน่ใจว่าสิทธิพิเศษของผู้ใช้?
Shamim Hafiz

4
ฉันให้คุณตัดสินใจ Sudo , ไม่มี Sudo
มิทช์

6
เพิ่งหมดความสนใจ อะไรคือข้อได้เปรียบของfindมากกว่าls -R?
don.joey

1
@ don.joey สิ่งนี้อาจช่วยstackoverflow.com/questions/13830036/…
Mitch

10
-1 สำหรับการผสมfindและgrepเมื่อfindสามารถทำการกรองโดยใช้ทั้ง regexes และ globs และไม่ใช้find's -print0และ grep's -zเมื่อคุณต้องการผสม
muru

147

คุณสามารถทำได้ด้วยการค้นหาเท่านั้น:

find . -name '*.xml'

.เป็นไดเรกทอรีปัจจุบัน หากคุณต้องการค้นหาในไดเรกทอรีอื่นแทนที่.ด้วยเส้นทางไดเรกทอรี


2
มันค้นหาไฟล์ที่ต้องการซ้ำในไดเรกทอรีที่รูทที่ไดเรกทอรีปัจจุบันหรือไม่ ในกรณีของฉันมันเพิ่งตรวจสอบในไดเรกทอรีปัจจุบันเท่านั้นไม่ได้ตรวจสอบไดเรกทอรีย่อย
Mostafiz Rahman

1
@mostafiz คุณต้องอ้างถึงส่วน '* .xml' ฉันจะแก้ไขคำตอบของฉัน
KaeruCT

1
จริงๆแล้วฉันค้นหา.phpไฟล์ในไดเรกทอรีปัจจุบัน แต่จะส่งคืนเฉพาะ.phpไฟล์ในไดเรกทอรีปัจจุบันเท่านั้นไม่ได้ค้นหาซ้ำในไดเรกทอรีย่อย นั่นเป็นเหตุผลที่ฉันถามว่าfindคำสั่งค้นหาซ้ำหรือไม่
Mostafiz Rahman

3
@mostafiz findคำสั่งค้นหาแบบวนซ้ำ หากคุณไม่อ้างอิงพารามิเตอร์ฉันคิดว่าเชลล์ของคุณอาจทำการขยายบน*ดังนั้นมันจะจับคู่ไฟล์ในไดเรกทอรีปัจจุบัน
KaeruCT

เอาล่ะ! อาจเป็นเพราะฉันทำผิดพลาด ตอนนี้มันทำงานได้อย่างสมบูรณ์แบบ!
Mostafiz Rahman

13

ลองคำสั่งนี้:

ls -R | grep '.*[.]xml'

lsไม่มีตัวเลือกในการกรองเอาต์พุต เพื่อที่คุณจะต้องใช้ท่อ สิ่งนี้จะส่งผ่านเอาต์พุตจากlsไปยังgrepซึ่งจะกรอง.xmlไฟล์เพื่อแสดงเฉพาะไฟล์


5
จะได้รับสิ่งนี้เพื่อแสดงไดเรกทอรีมันมาจากไหน?
AdamO

1
การเชื่อมโยงบังคับ: ทำไมไม่แยกls?
Ruslan

4

ทุบตี

การใช้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

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สำหรับ

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