Unix'te belirli uzantılarla bitmeyen dosya adları mı buldunuz?


207

Yinelemeli yok bir dizin hiyerarşisi tüm dosyaları bulmak için basit bir yolu var mı yok uzantılarının listesi sona? Örneğin, * .dll veya * .exe olmayan tüm dosyalar

UNIX / GNU bulmak, öyle güçlü gibi bir sahip görünmüyor exclude(veya bunu özlüyorum) modunu ve her zaman şeyler bulmak için normal ifadeleri kullanmak zor buldum yok belli ifadeyle eşleşen .

Windows ortamındayım ( çoğu GNU aracının GnuWin32 portunu kullanarak ), bu yüzden sadece Windows çözümlerine eşit derecede açıkım .

Yanıtlar:


343

Veya onsuz (ve kaçma ihtiyacı:

find . -not -name "*.exe" -not -name "*.dll"

ve ayrıca dizinlerin listesini hariç tutmak

find . -not -name "*.exe" -not -name "*.dll" -not -type d

veya pozitif mantıkta ;-)

find . -not -name "*.exe" -not -name "*.dll" -type f

6
-notile değiştirilebilir '!'(Alıntı önerilir). Diğer yandan, -namebüyük / küçük harfe -inameduyarsızken büyük / küçük harfe duyarsızdır.
Ivan Chau


8
$ find . -name \*.exe -o -name \*.dll -o -print

İlk iki adlı seçeneklerin baskı izi seçeneği yoktur, bu nedenle atlanırlar. Diğer her şey yazdırılır.


4

Grep komutunu kullanarak bir şeyler yapabilirsiniz:

find . | grep -v '(dll|exe)$'

-vBayrak grepözellikle "şeyler bulmak anlamına gelir yok bu ifadeyi maç."


6
grep -v '\. (dll | exe) $' againsta'nın "dexe" adlı bir dosya veya dizinle eşleşmesini engeller, örneğin
drAlberT

Bu yalnızca genişletilmiş normal ifade ile çalışır. Bu işi yapmak için -E (ya da egrep kullanmak) eklemek zorunda kaldım.
joctee

2

bir tane daha :-)

$ ls -ltr
toplam 10
-rw-r - r-- 1 scripter linuxdumb 47 Ara 23 14:46 test1
-rw-r - r-- 1 scripter linuxdumb 0 Oca 4 23:40 test4
-rw-r - r-- 1 scripter linuxdumb 0 Oca 4 23:40 test3
-rw-r - r-- 1 scripter linuxdumb 0 Oca 4 23:40 test2
-rw-r - r-- 1 komut dosyası linuxdumb 0 Oca 4 23:41 dosya5
-rw-r - r-- 1 komut dosyası linuxdumb 0 Oca 4 23:41 dosya4
-rw-r - r-- 1 komut dosyası linuxdumb 0 Oca 4 23:41 dosya3
-rw-r - r-- 1 komut dosyası linuxdumb 0 Oca 4 23:41 dosya2
-rw-r - r-- 1 komut dosyası linuxdumb 0 Oca 4 23:41 dosya1
$ find. -tip f! -adı "* 1"! -name "* 2" -baskı
./test3
./test4
./file3
./file4
./file5
$

Unix find komut başvurusu


1
find  /data1/batch/source/export   -type f -not  -name "*.dll" -not -name "*.exe"

1

Linux / OS X:

Geçerli dizinden başlayarak, .dll veya .exe ile biten tüm dosyaları özyinelemeli olarak bulun

find . -type f | grep -P "\.dll$|\.exe$"

Geçerli dizinden başlayarak, .dll veya .exe ile bitmeyen tüm dosyaları özyinelemeli olarak bulun

find . -type f | grep -vP "\.dll$|\.exe$"

Notlar:

(1) grep'teki P seçeneği, grep komutuyla birlikte kullanılacak normal ifadelerimizi yazmak için Perl stilini kullandığımızı gösterir . Grep komutunu düzenli ifadelerle birlikte dışlamak amacıyla Perl stilinin en güçlü stil olduğunu görüyorum.

(2) grep'teki v seçeneği, kabuğa normal ifadeyi karşılayan herhangi bir dosyayı hariç tutmasını bildirir

(3) ".dll $" ifadesinin sonundaki $ karakteri, kabuk adı dosya adı dizesinin ".dll" ile biteceğini söyleyen bir sınırlayıcı denetim karakteri.


0

Uzun bir uzantı listeniz varsa - uzun bir dizi -not -name 'this' -not -name 'that' -not -name 'other'sıkıcı ve hataya açık olabilir - veya arama programlıysa ve uzantı listesi çalışma zamanında oluşturulmuşsa , bu sayfadaki diğer çözümler istenmez .

Bu durumlar için, verileri (uzantıların listesi) ve kodu (ile parametreleri) daha net bir şekilde ayıran bir çözüm findistenebilir. Şuna benzeyen bir dizin ve dosya yapısı verildiğinde:

.
└── a
    ├── 1.txt
    ├── 15.xml
    ├── 8.dll
    ├── b
    │   ├── 16.xml
    │   ├── 2.txt
    │   ├── 9.dll
    │   └── c
    │       ├── 10.dll
    │       ├── 17.xml
    │       └── 3.txt
    ├── d
    │   ├── 11.dll
    │   ├── 18.xml
    │   ├── 4.txt
    │   └── e
    │       ├── 12.dll
    │       ├── 19.xml
    │       └── 5.txt
    └── f
        ├── 13.dll
        ├── 20.xml
        ├── 6.txt
        └── g
            ├── 14.dll
            ├── 21.xml
            └── 7.txt

Bunun gibi bir şey yapabilirsiniz:

## data section, list undesired extensions here
declare -a _BADEXT=(xml dll)

## code section, this never changes
BADEXT="$( IFS="|" ; echo "${_BADEXT[*]}" | sed 's/|/\\|/g' )"
find . -type f ! -regex ".*\.\($BADEXT\)"

Sonuç:

./a/1.txt
./a/b/2.txt
./a/b/c/3.txt
./a/d/4.txt
./a/d/e/5.txt
./a/f/6.txt
./a/f/g/7.txt

Kod bloğunu değiştirmeden uzantı listesini değiştirebilirsiniz.

NOT yerel OSX ile çalışmaz find- bunun yerine gnu find kullanın.

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.