Temukan file dalam banyak nama folder

44

Saya mencoba untuk daftar semua file dari dir1, dir2, dir3dan dir4yang mungkin di mana saja di sebagai sub direktori saya cwdmenggunakan findperintah. Saya mencoba yang berikut ini tanpa hasil:

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'

Saya mencoba posix-extendedjuga. Bagaimana saya bisa mendaftar file-file ini?

Harun
sumber
Temukan . -type f -regextype sed -regex ". * / dir [1-4] / [a-z0-9] *" .. jawaban terpendek sejauh ini :) lihat jawaban di bawah ini .. unix.stackexchange.com/a/390333 / 242983
alpha_989

Jawaban:

59

Dan jika Anda ingin mencari tiga folder bernama foo, bardan bazuntuk semua *.pyfile, gunakan perintah ini:

find foo bar baz -name "*.py"

jadi jika Anda ingin menampilkan file dari dir1 dir2 dir3penggunaanfind dir1 dir2 dir3 -type f

coba ini find . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;

harish.venkat
sumber
Saya harus mengklarifikasi. Saya mungkin tidak memiliki jalur ke file yang ingin saya cari. Saya hanya tahu mereka adalah sub direktori dari direktori saat ini.
Aaron
gunakan ./dirsebagai gantidir
harish.venkat
Dir masih perlu berada dalam cwd, mungkin dua level lebih rendah (misalnya ./path/to/dir1), dalam hal ./dir1ini tidak ada.
Aaron
edit jawabannya.
harish.venkat
8

Cara terbaik untuk menggunakan direktif -path:

find .  \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)

Yang berarti: temukan semua file di bawah direktori saat ini di mana ada 'dir1' atau 'dir2' atau 'dir3' atau 'dir4' di path.

Perawatan berkala
sumber
Anda memiliki tanda kurung di tempat yang salah. Lihat juga -adan -ountuk standar yang setara dengan GNU -and/ -or.
Stéphane Chazelas
4

Hanya untuk memberi tahu semua orang. Menambahkan .*/sebelum masing-masing dirmemecahkan masalah karena regexcocok dengan path lengkap tampaknya.

Harun
sumber
3

Ini adalah ide pertama saya setelah membaca jawaban sebelumnya:

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"

Ini memperhitungkan, bahwa regex harus cocok dengan seluruh nama file, dan lebih mudah dimengerti.

Ronin Tom
sumber
2

Contoh fast (!) Menemukan file tertentu (access_log) di beberapa lokasi yang ditentukan oleh wildcard (direktori home) dan direktori log apache2 umum yang menerapkan juga pemfilteran nama untuk mengecualikan ssl log dan gzipped log lama. Tidak langsung menjawab pertanyaan di sini tetapi mungkin bermanfaat bagi seseorang yang menemukan petunjuk ini (seperti saya).

find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*"

Hati-hati dengan ruang, khususnya di dekat \(dan \).

Omong-omong, saya menggunakannya untuk apachetop, untuk menemukan situs web yang paling aktif di server saya.

apachetop -d1 -s9 -p $(find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/)
Kristjan Adojaan
sumber
2

Anda tidak perlu menentukan dir1 ke dir4 dengan nama jika Anda menggunakan regextype

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f: cari file bukan direktori
  • regextype sed: menggunakan sed regextype
  • regex: pencarian menggunakan regex di seluruh jalur
  • ".*/dir[1-4]/[a-z0-9]*":. * di awal berarti sejumlah karakter yang dapat bertipe (char / number / backslash (/) dll); dir [1-4] berarti mencari "dir" diikuti oleh angka antara 1 dan 4; / [^ /] * menyatakan bahwa mengikuti dir1-4 menghilangkan semua nama path yang memiliki / di dalamnya, sehingga hanya mengembalikan file dalam direktori dir1-dir4 dan mengabaikan subdirektori yang mungkin berada dalam dir1-dir4.

membuat direktori untuk Anda mengujinya: https://github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017

alpha_989
sumber
(1) Kita mungkin tidak pernah tahu situasi atau persyaratan Harun yang tepat, tetapi jawaban lain telah membuat keputusan bijaksana bahwa ia memiliki empat direktori, yang namanya tidak ditentukan. (Mereka bisa red, green, bluedan yellow, atau mereka bisa John, Paul, Georgedan Ringo.) Jawaban Anda menganggap bahwa mereka adalah harfiah dir1 , dir2, dir3dan dir4. … (Lanjutan)
Scott
(Lanjutkan) ... (2) Mengapa Anda menganggap bahwa Aaron tidak ingin mencari subdirektori? Dia tampaknya mengatakan bahwa dia melakukannya. (3) Mengapa Anda membatasi pencarian pada file yang namanya hanya mengandung huruf kecil dan digit (tidak termasuk hal-hal seperti foo_bar, foo.txtdan FOO)? (4) Mengapa teks Anda menjelaskan /[^/]*ketika jawaban Anda tidak menggunakannya?
Scott
Hai Scott, itu untuk komentar Anda.
alpha_989
(1-3). ia menyebutkan "Saya mencoba membuat daftar semua file dari dir1, dir2, dir3 dan dir4 " yang mungkin ada di mana saja sebagai sub direktori cwd saya , yang berarti bahwa dir1-dir4 mungkin ada di mana saja, tetapi ia ingin menemukan file yang tepat dalam dir1-dir4. tentu saja, jika ini bukan dir1-dir4, Anda harus mengubahnya ke nama spesifik menggunakan red \ | blue \ | green \ | dll ..
alpha_989
4. salah ketik .. Saya menggunakan [a-z0-9] * sebelum..kemudian menyadari [^ /] * lebih pendek dan lebih inklusif..tidak mau mengubahnya ketika saya memposting ini. Terima kasih atas komentar cermat Anda.
alpha_989
0

Saya tahu Anda menentukan bahwa menggunakan find, tetapi hanya untuk menunjukkan opsi lain yang dapat digunakan, Anda dapat menggunakan xargs:

find . -type d | grep -E "dir1$|dir2$" | xargs ls  

find . -name "dir1" -or -name "dir2" | xargs ls

Anda dapat memiliki file bernama "folder" yang berisi sesuatu seperti:

$ cat folders
dir1
dir2
dir3
dir4

Kemudian, Anda dapat melakukan sesuatu seperti ini:

$ cat folders | xargs -I % find . -type d -name % | xargs ls
./Documents/dir1:
file1  file2  file3  file4

./Documents/dir2:
file1  file2  file3  file4

./Documents/dir3:
file1  file2  file3  file4

./Documents/dir4:
file1  file2  file3  file4

xargs menurut saya, saya merasa lebih fleksibel daripada menemukan -exec. Anda juga dapat membuat beberapa hal gila seperti

$ cat << EOF | xargs -I {} find ~ -name "{}" | xargs ls
> dir1
> dir2
> dir3
> EOF
/home/user/Documents/dir1:
file1  file2  file3  file4

/home/user/Documents/dir2:
file1  file2  file3  file4

/home/user/Documents/dir3:
file1  file2  file3  file4
Cuauhtli
sumber