Birden fazla klasör adındaki dosyaları bulma


44

Ben tüm dosyaları listeye çalışıyorum dir1, dir2, dir3ve dir4hangi benim bir alt dizini olarak herhangi bir yerinde olabilir cwdkullanarak findkomutu. Aşağıdakileri başarılı olmadan denedim:

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

Ben de denedim posix-extended. Bu dosyaları nasıl listeleyebilirim?


Bul tipi f-regextype sed -regex ". * / dir [1-4] / [a-z0-9] *" .. şimdiye kadarki en kısa cevap :) aşağıdaki cevaba bakınız .. unix.stackexchange.com/a/390333 / 242983
alpha_989 4:17

Yanıtlar:


59

Ve üç klasör adında aramak istiyorsanız foo, barve bazherkes için *.pydosyaları, bu komutu kullanın:

find foo bar baz -name "*.py"

yani dir1 dir2 dir3kullanımdan dosyaları görüntülemek istiyorsanızfind dir1 dir2 dir3 -type f

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


Aydınlatmalıydım. Aramak istediğim dosyaların yolunu alamayabilirim. Yalnızca geçerli dizinin alt dizinleri olduklarını biliyorum.
Aaron

./diryerine kullanındir
harish.venkat 10:13

Dir, hala cwd'de olması gerekir, ancak iki seviye daha düşük olabilir (örn. ./path/to/dir1), Bu durumda ./dir1mevcut olmaz.
Aaron

cevabı düzenledi.
harish.venkat

8

-Path yönergesini kullanmak en iyisidir:

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

Bunun anlamı: Yoldaki 'dir1' veya 'dir2' veya 'dir3' veya 'dir4' olan mevcut dizindeki tüm dosyaları bul.


Parantez yanlış yerde. Ayrıca bkz -ave -oGNU standart eşdeğeri -and/ ' -or.
Stéphane Chazelas

4

Sadece herkese bildirmek için. .*/Her birinin önüne ekleme yapmak dir, sorunu regexgöründüğü tam yolla eşleştiği için sorunu çözdü .


3

Bu önceki cevapları okuduktan sonra ilk fikrim:

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

Bu, regex'in tüm dosya adıyla eşleşmesi gerektiğini hesaba katar ve anlaşılması daha kolaydır.


2

Hızlı (!) Joker karakter (home dizini) ve genel apache2 log dizini tarafından tanımlanan birden fazla konumdaki belirli dosyaları (access_log) bulma da ssl günlüklerini ve eski günlükleri dışlamak için ad filtrelemesi uygulayarak örneklenir. Buradaki soruyu doğrudan yanıtlamıyor, ancak bu talimatları (benim gibi) bulan bir kişi için yararlı olabilir.

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

Özel olarak \(ve yakınında bulunan boşluklara dikkat edin \).

Bu arada, sunucumdaki en aktif web sitelerini bulmak için apachetop için kullandım.

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

2

regextype kullanıyorsanız, dir1 ile dir4 arasında isim belirtmeniz gerekmez.

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f: dizinleri değil dosyaları bul
  • regextype sed: sed regextype kullanıyor
  • regex: tüm yol üzerinde regex kullanarak arama yapar
  • ".*/dir[1-4]/[a-z0-9]*":. * başlangıçta, tür olabilecek herhangi bir sayıdaki karakter anlamına gelir (char / number / backslash (/) etc); dir [1-4] "dir" ifadesini, ardından 1 ile 4 arasında bir sayıyı arar; / [^ /] *, dir1-4 izleyende içindeki / içindeki herhangi bir yolu geçersiz kıldığını belirtir, bu nedenle yalnızca dir1-dir4 dizinindeki dosyaları döndürür ve dir1-dir4 içinde olabilecek tüm alt dizinleri yok sayar.

test etmek için bir dizin oluşturdu: https://github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017


(1) Aaron'un kesin durumunu veya gereksinimlerini asla bilemeyebiliriz, ancak diğer cevaplar, adlarını belirtilmeyen dört klasöre sahip olduğu konusunda ihtiyatlı bir karar vermiştir. (Olabilir red, green, blueve yellow, ya da olabilir John, Paul, Georgeve Ringo.) Cevabınız olduklarını varsayar anlamıyla dir1 , dir2, dir3ve dir4. … (Devam ediyor)
Scott

(Devam ediyor)… (2) Neden Aaron'un alt dizinleri aramak istemediğini düşünüyorsunuz? O yaptığını söylüyor gibi görünüyor. (3) Neden isimleri dosyalarına sınırlayan olan içerirler salt düşürmek harf ve rakam (gibi şeyler hariç foo_bar, foo.txtve FOO)? (4) Metniniz neden /[^/]*cevabınızı kullanmadığında açıklıyor ?
Scott

Merhaba Scott, yorumunuz için bu.
alpha_989

(1-3). " cdd'nin bir alt dizini olarak olabilecek" dir1, dir2, dir3 ve dir4'deki tüm dosyaları listelemeye çalışıyorum " diyor, bu dir1-dir4'ün herhangi bir yerde olabileceği anlamına geliyor, ancak dosyayı doğru bulmak istiyor dir1-dir4 dahilinde. elbette, dir1-dir4 değilse, red \ | blue \ | green \ | kullanarak belirli isimlerle değiştirmelisiniz. etc ..
alpha_989

4. orada yazım hatası .. Daha önce [a-z0-9] * kullandım ... daha sonra fark ettim [^ /] * daha kısa ve daha kapsayıcı .. bunu gönderdiğimde değiştirmeyi unuttum. Dikkatli yorumlarınız için teşekkür ederiz.
alpha_989

0

Bul kullanarak kullandığınızı belirttiğinize göre, yalnızca kullanılabilecek diğer seçenekleri göstermek için xargs kullanabilirsiniz:

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

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

Gibi bir şey içeren "klasörler" adlı bir dosya olabilir:

$ cat folders
dir1
dir2
dir3
dir4

Sonra, böyle bir şey yapabilirsiniz:

$ 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 bence, -exec'i bulmaktan daha çok yönlü hissediyorum. Ayrıca gibi çılgın şeyler yapabilirsiniz

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.