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?
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:
basitçe:
find . ! -name '*2013*'
Bir ekleme ! -type d
de tip dosyaları dışlamak için dizine (gibi .
kendisi) veya -type f
sadece 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 2013
eğ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éphane2013
dosyayı rapor eder é
.
En iyisi, dosya adlarının yerel ayarın karakter kümesinde kodlandığından emin olmaktır, ancak bunu garanti find
edemezseniz, C yerel ayarında bir çözüm bulmaktır:
LC_ALL=C find . ! -name '*2013*'
Ksh dosya adı modelleri yeterlidir:
# files with 2013
ls -d -- *2013*
# files without 2013
ls -d -- !(*2013*)
Kabuğunuz bash ise, shopt -s extglob
bu 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, ls
kullanmak için doğru komut olmayabilir. Bunları bir dizide saklamak için
filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
Geçerli dizinde belirli bir dize içermeyen tüm dosyaları bulun, burada "2013":
find . ! -name "*2013*" -type f
ls
desen herhangi bir dosyayla eşleşmezse bir hata iletisi döndürür). Ayrıcaksh
listenin sıralanacağını da unutmayın .