Yalnızca belirtilen dosyalar dışında bir klasördeki tüm dosyaları nasıl kaldırabilirim?


11

Sadece bazı belirtilen dosyaları terk ederken bir dizindeki tüm dosyaları kaldırmak istiyorum, adlarıyla ortak bir şey yok. Bunu nasıl başarabilirim?

Örneğin, saklamak istediğim dosya adları:

file_1.png, another_file.jpg,some_music.mp3

Yanıtlar:


15

Eğer bash kullanıyorsanız:

shopt -s extglob
rm -- !(file1|file2|file3)

İlk satır sadece genişletilmiş desen eşleşmesini etkinleştirir ve bundan sonra bunlardan birini kullanırız:

!(pattern-list) verilen kalıplardan biri dışındaki herhangi bir şeyle eşleşir

ve desen listesi, a ile ayrılmış bir veya daha fazla desenin listesidir |.


Veya ile zsh

setopt extendedglob
rm -- ^(file1|file2)

Ya da, daha taşınabilir find:

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +

3
İsteğe bağlı kabuk davranışının nasıl geri döndürüleceğini eklemek yararlı olabilir ( shopt -u extglob).
geedoubleya

7

Bir alt dizin oluşturun tmp, saklamak istediğiniz tüm dosyaları bu dizine taşıyın ve rm -f *daha sonra yapın. Bu tmpdizini etkilemez .

Bundan sonra sadece yapın:

mv tmp/* .
rmdir tmp

(Taşıdığınız dosyaların hiçbirinin bir nokta ile başlamadığını varsayarsak).

Bu, fareyi ve Nautilus gibi bir dosya tarayıcısını kullanmanın mantıklı olduğu birkaç durumdan biridir, burada Ctrltutmak istediğiniz birkaç dosyayı tıklatabilir ve ardından menüyü kullanabilirsiniz: Edit -> Invert Selectiondiğer dosyaları almak ve daha sonra bunları silmek için .


dosyaları tmp dizinine taşımak hoş geliyor. Her neyse, bunu komut satırı ile yapmak zorundayım. Teşekkürler!
AGamePlayer

3
@AwQiruiGuo Tmp, istemediklerinizi geri dönülmez bir şekilde kaldırmadan önce dosyaları iki sete ayırması avantajına sahiptir. Böylece lskorumak istediğiniz dosyalardan herhangi birini kaçırıp kaçırmadığınızı görmek için bir komutunu kullanabilirsiniz.
Anthon

2

Saklamak istediğiniz dosyaların adlarını her satıra bir metin dosyasına ekleyin. Bu dosya dizinde olmamalı veya adını da eklemelisiniz.

Senin dizinin adı ise foo ve dosyanın adıdır çubuk şunu yapın.

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

Bu aşağıdakileri yapar:

  1. find -type ffoo ve alt dizinlerindeki tüm dosyaların adlarını arar ve STDOUT'a yazdırır. Seçenek ile -print0dosya adlarını NUL baytları ile sınırlar.
  2. grep -v -f barçubuktaki bir satırla eşleşen tüm dosya adlarını hariç tutar . Seçeneği ile -z, girdisini NUL -Zbaytıyla sınırlandırılmış bir dizi satır olarak ele alır, seçeneği ile çıkışını bir NUL baytıyla sınırlar.
  3. xargs rmrmdosyaları silmek için art arda çağırır . Opsiyon ile -0, girdisini NUL baytı tarafından sınırlanan bir dizi satır olarak ele alır.

Bu, boşluk içeren dosya adlarıyla çalışır.


Dosya adlarında yeni satırlar olabileceğinden bu çalışmaz.
Anthon

@Anthon, newline da dahil olmak üzere boşluk içeren dosya adları ile başa çıkmak için find, grep, xargs seçeneklerini değiştirdi
Mathias Weidner

findfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
Kullanmak
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.