Cara Mencari File secara Rekursif ke dalam Subdirektori

117

Saya mencoba mencari semua XMLfile dalam direktori tertentu dan semua sub-direktori (secara rekursif) di dalamnya.

ls -R *.xmlhanya daftar file dalam direktori saat ini. Saya cukup yakin, sub-folder itu sendiri memiliki beberapa .xmlfile, tetapi tidak ada yang muncul.

Apakah ini masalah konfigurasi?

Shamim Hafiz
sumber
2
Anda dapat melakukannyals -R | grep .xml
Nikos

Jawaban:

90

Coba gunakan Temukan

sudo find . -print | grep -i '.*[.]xml'
Mitch
sumber
4
apakah sudo harus, atau itu ada di sana untuk memastikan hak pengguna super?
Shamim Hafiz
4
Saya membiarkan Anda memutuskan. Sudo , Tidak Sudo .
Mitch
6
Hanya karena ketertarikan. Apa keuntungan dari findatas ls -R?
don.joey
1
@ don.joey Ini mungkin membantu stackoverflow.com/questions/13830036/...
Mitch
10
-1 untuk pencampuran finddan grep, kapan findbisa melakukan penyaringan menggunakan kedua regex dan gumpalan, dan tidak menggunakan find' -print0dan grep -zketika Anda perlu mencampur.
muru
147

Anda dapat melakukannya hanya dengan menemukan :

find . -name '*.xml'

.adalah direktori saat ini. Jika Anda perlu mencari di direktori lain, ganti .dengan jalur direktori.

KaeruCT
sumber
2
Apakah itu mencari file yang diperlukan secara rekursif di direktori yang di-root di direktori saat ini. Dalam kasus saya itu hanya memeriksa di direktori saat ini saja, tidak memeriksa subdirektori.
Mostafiz Rahman
1
@mostafiz, Anda perlu mengutip bagian '* .xml'. Saya akan mengedit jawaban saya.
KaeruCT
1
Sebenarnya saya mencari .phpfile di direktori saat ini. Tetapi hanya mengembalikan .phpfile dalam direktori saat ini, tidak mencari secara rekursif di sub-direktori. Itu sebabnya saya bertanya apakah findperintah mencari secara rekursif atau tidak.
Mostafiz Rahman
3
@mostafiz, findperintah mencari secara rekursif. Jika Anda tidak mengutip parameter, saya pikir shell Anda mungkin melakukan ekspansi pada *, jadi itu akan cocok dengan file di direktori saat ini.
KaeruCT
Baiklah! Mungkin saya melakukan kesalahan. Sekarang bekerja dengan sempurna!
Mostafiz Rahman
13

Coba perintah ini:

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

lstidak memiliki opsi untuk memfilter output. Untuk itu Anda perlu menggunakan pipa. Ini meneruskan output dari lske grep, yang kemudian memfilternya untuk hanya menampilkan .xmlfile.

Rohit Jain
sumber
5
Pokoknya untuk mendapatkan ini untuk menunjukkan direktori asalnya?
AdamO
1
Tautan wajib: Mengapa tidak diuraikan ls?
Ruslan
4

pesta

Menggunakan globstaropsi shell, kita bisa menggunakan globbing rekursif./**/*

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 memiliki modul Find, yang memungkinkan untuk traversal direktori pohon rekursif. Dalam find()fungsi khusus , kita dapat mendefinisikan subrutin yang diinginkan dan direktori yang ingin kita lintasi, dalam contoh ini .. Satu-liner dalam kasus tersebut adalah:

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

Python

Sementara Perl memiliki seluruh modul yang didedikasikan untuk traversal pohon rekursif, Python memiliki fungsi rapi walk()yang merupakan bagian dari osmodul, dan berulang kali mengembalikan tuple jalur teratas, daftar semua subdirektori, dan daftar nama file. Kita dapat melakukan hal berikut:

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

Ini mungkin jauh lebih rapi sebagai skrip:

#!/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))

Temukan

Jawaban lain telah disebutkan finduntuk traversal rekursif, dan itulah alat masuk untuk pekerjaan itu. Apa yang perlu disebutkan adalah fakta yang findmemiliki beberapa saklar baris perintah, seperti -printfuntuk mencetak output dalam format yang diinginkan, -type funtuk menemukan hanya file biasa, -inumuntuk mencari berdasarkan nomor inode, -mtimeuntuk mencari berdasarkan tanggal modifikasi, -exec <command> {} \;untuk mengeksekusi perintah tertentu untuk memproses file dengan meneruskan file sebagai argumen (di mana placeholder {}standar finduntuk file saat ini), dan banyak lainnya, jadi silakan baca manualnya untuk find.

Sergiy Kolodyazhnyy
sumber