Belirtilen bir dize içermeyen dosya adlarını bulma


19

Aşağıdakilerin tam tersini yapmak istiyorum:

find . -name "*2013*"

Geçerli dizinde adlarında "2013" dizesini içermeyen tüm dosyaları bulun. Bunu nasıl yapabilirim?

Yanıtlar:


28

basitçe:

find . ! -name '*2013*'

Bir ekleme ! -type dde tip dosyaları dışlamak için dizine (gibi .kendisi) veya -type fsadece içerecek şekilde düzenli (... dizinleri, fifos, sembolik bağlar, cihazlar, prizler) diğer tüm dosya türleri hariç dosyaları.

Bununla birlikte *, 0 veya daha fazla karakterden oluşan bir diziyle eşleştiğine dikkat edin . O içeren dosya adlarını bildirebiliyordu Yani 2013eğer 2013öncesinde veya tamamen geçerli yerelde geçerli karakter olarak deşifre edilecek bir şey olmadığını izledi.

Bu, karakterlerin farklı bir kodlamada kodlanan dosya adları için birden fazla baytta (UTF-8'de olduğu gibi) kodlanabileceği bir yerel ayardaysanız olabilir. Örneğin, UTF-8 yerel ayarında, iso8859-15 karakter kümesinde (0xe9 bayt olarak) kodlanmışsa, bir Stéphane2013dosyayı rapor eder é.

En iyisi, dosya adlarının yerel ayarın karakter kümesinde kodlandığından emin olmaktır, ancak bunu garanti findedemezseniz, C yerel ayarında bir çözüm bulmaktır:

LC_ALL=C find . ! -name '*2013*'

4

Ksh dosya adı modelleri yeterlidir:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

Referans

Kabuğunuz bash ise, shopt -s extglobbu deseni kullanmadan önce koşmanız gerekir (bunu içine koyabilirsiniz .bashrc). Kabuğunuz zsh ise, çalıştırmanız gerekir setopt ksh_glob(içine koyabilirsiniz .zshrc). Zsh da ls -d -- ^*2013*bir ön hazırlık gerektiren sunuyor setopt extended_glob.

Bu dosya adlarıyla ne yaptığınıza bağlı olarak, lskullanmak için doğru komut olmayabilir. Bunları bir dizide saklamak için

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

4
Bu, alt dizinlerde geçerli değildir ve nokta dosyalarını atlar (ve lsdesen herhangi bir dosyayla eşleşmezse bir hata iletisi döndürür). Ayrıca kshlistenin sıralanacağını da unutmayın .
Stéphane Chazelas

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.