it-swarm-tr.com

Dizinsiz dosyaları listeleme ve ada göre filtreleme (ls seçenekleri)

uploads adında bir dizinim var. Bir grup dosya ve ayrıca dosyaları içeren birkaç alt dizin içerir.

(Bir adımda) aşağıdakileri yapabileceğim bir yol var mı:

  1. SADECE kök uploads dizinindeki dosyaları listeleyin - Alt klasör adlarını veya içeriklerini görmek istemiyorum;

    ve

  2. t_ İle başlayan hiçbir dosyayı listelemeyin.

-d Bayrağını biliyorum, ama bana istediğimi pek getirmiyor.

45
EmmyS

Bu find için bir iş gibi geliyor.

  • Alt klasörlerin içinde özyinelemeli olarak arama yapmak yerine yalnızca geçerli dizini döndürmek için -maxdepth Kullanın
  • -type f İşlevini yalnızca dosyaları döndürmek için kullanın; dizinleri veya aygıt düğümlerini veya başka herhangi bir şeyi döndürmeyin
  • İstemediğiniz adlara sahip dosyalardan kaçınmak için -not Ve -name

Bu şekilde bir araya gelebilir:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
55
Caleb

GNU ls (yani gömülü olmayan Linux sistemlerindeki ls komutu ve diğer bazı birimlerde de bulunan Cygwin), bazı dosyaları adlarına göre gizleme seçeneğine sahiptir. Ancak dizinleri görmezden gelmenin bir yolu yoktur.

ls --hide='t_*' uploads

Başka bir yaklaşım, Shell'inizin eşleşmesini yapmasıdır. Bash, ksh ve zsh, t* İle eşleşenler dışındaki tüm dosyalarla eşleşmek için !(t_*) olumsuzlama düzenine sahiptir; bash'da bu özelliğin shopt -s extglob ile açılması ve zsh'da setopt ksh_glob ile açılması gerekir. Zsh ayrıca ^t_* İle açılması gereken eşdeğer sözdizimine setopt extended_glob Sahiptir. Bu hala dizinleri görmezden gelmez. Zsh, dosyaları yalnızca ada göre değil, aynı zamanda meta veriler ve daha fazlası ile eşleştirmeye izin veren ekstra bir özelliğe sahiptir: glob niteleyicileri . Normal dosyalarla kısıtlamak için eşleşmenin sonuna (.) Ekleyin. Olumsuzlama ^ Ad eşleme sözdiziminin bir parçasıdır, bu nedenle ^t_*(.) “normal dosya eşleşmesi olmayan tüm normal dosyalar t_*” Değil, “normal dosya eşleşmesi olmayan tüm dosyalar” anlamına gelir t_*”.

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

Kendinizi gelişmiş araçlar olmadan bulursanız, bunu find ile herhangi bir unix üzerinde yapabilirsiniz. Genellikle komut satırına yazacağınız bir şey değildir, ancak güçlü ve kesindir. Caleb bunun nasıl yapılacağını zaten GNU find ile gösterdi. -maxdepth Seçeneği taşınabilir değil; -Prune Kullanabilirsiniz bunun yerine, find öğesinin tekrarlanmasını önlemek için taşınabilir bir şekilde durdurun.

find uploads/* -type d -Prune -o \! -type f -name 't_*' -print

ls dosyasını dosyalardaki favori seçeneklerinizle yürütmek için -print Yerine -exec ls -lG -- {} + Yazın.

Yukarıdaki tüm komutlar nokta dosyalarını gizler (yani adı . İle başlayan dosyalar). Bunları görüntülemek istiyorsanız, -A 'U ls' e iletin veya D glob niteleyicisini zsh (ls uploads/^t_*(.D)) içine ekleyin. find ile, onu yalnızca bir düzey geri çekilmek için farklı bir yaklaşım kullanabilirsiniz (find nokta dosyalarını özel olarak işlemez). Bu yalnızca geçerli dizinde find çalıştırırsanız tamamen çalışır.

cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$

Find'ın -maxdepth taşınabilirlik sorunu önemliyse, aşağıdakileri kullanabilirsiniz:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

Ben uzman değilim, ama bence bu işe yaramalı. Sanırım biraz şifreli görünüyor, ama eğer awk konuşuyorsanız, gerçekten değil. 9 $ yerine $ NF kullanılabilir. Ayrıca şunları da yapabilirsiniz:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

aynı şeyi yapar (ama belki de öncekinden daha az verimli ???).

Aslında, diğer yayınları düşündükten sonra,

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

daha da kısa ve net bir yol.

Eğer yanılıyorsam birisi beni düzeltsin. :-)

0
kkaszub

Bu kısa yolları buldum:

ls -p uploads | grep -Ev '/'

veya

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

ls ve kanallarını kullanarak bir şans vereyim:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

diyelim ki son sütun 9. sütun.

0
Y0NG