Sonek içermeyen dosyaları bulmak ve silmek istiyorum. Bunu nasıl yapıyorsun?


0

Bir klasördeki tüm klasörleri ve alt klasörlerini belirli bir özelliğe sahip bulmak ve silmek istiyorum: üç harfli sonekleri yoktur. Bunu nasıl yapıyorsun? Teşekkürler.

Yanıtlar:


3

TL; DR; (otomatik olarak öğeleri silerken bu gerçekten kötü bir fikirdir)

find . ! -name "*.???" -type f -max-depth 1 -delete


Düzgün açıklanmış ve test edilmiştir:

Adım 0: Test ortamını ayarlama:

mkdir test
cd test
touch test1
touch test1.bar
touch test1.foo
touch test1.baz
touch test1.bazar

Adım 1: Üç harfli uzantıya sahip tüm dosyaları bulun:

find . -name "*.???" -type f -print
./test1.bar
./test1.baz
./test1.foo

Adım 2: Seçimi ters çevirme

find . ! -name "*.???" -type f -print
./test1
./test1.bazar

3. Adım: Değiştir -printile -delete.

Alt dizinlere dalmak istemiyorsanız, bir -max-depth=1


1
Maxdepth seçeneğinin başka seçeneklerden önce gelmesi gerektiğini düşünüyorum (bu herhangi bir gerçek soruna neden olmaz, ancak en azından GNU'nun bulduğu bir hata verecektir). Ayrıca, öyle değil mi -maxdepth 1, yoksa bu 'geçerli çoklu sözdizimi' şeylerinden biri mi?
kötülük

Muhtemelen bir çizgi. En azından http://unixhelp.ed.ac.uk/CGI/man-cgi?find , FreeBSD (gösteriliyor -maxdepth n) ve daha eski bir Ubuntu ( -maxdepth levels) 'ya göre. Şimdi yazıyı düzeltin. Fark ettiğin için teşekkürler.
Hennes

Subdirs ekledim ve her ikisi de maxdepth ile ilk argüman olarak, son argüman olarak ve onunla ortada bir yerde denedim. Tüm sonuçlar aynıydı, bu yüzden sipariş önemli değil. En azından test sistemimde yok.
Hennes

2

4+ bash sürümünüz olduğunu varsayarak (kontrol edebilirsiniz bash --version)

shopt -s extglob  ##  turn on extended globbing
rm -- !(*.???)

Özyinelilik için:

shopt -s extglob globstar
rm -- **/!(*.???)

Genel olarak bu satırı .bashrc'inize koymanızı tavsiye ederim, çünkü genişletilmiş globbing ve globstar gerçekten yararlıdır:

shopt -s extglob globstar

1

Deneyebilirsin find.

Doğru dosyaları aldığınızdan emin olmak için önce bunları göstermek için bunu kullanın:

find . -type f ! -name "*.???"

Bunları silmek istediğinizden emin olduğunuzda, şunları kullanabilirsiniz:

find . -type f ! -name "*.???" -print0 | xargs -0 rm -rfv

veya -execyolu tercih ederseniz :

find . -type f ! -name "*.???" -exec rm -rfv {} +

not: {} +Yalnızca belirli bir sürüm ve üzeri sürümlerde çalışır ( ikinci paragrafın man findaltındaki el kitabına bakın -exec. Aksi takdirde kullanabilirsiniz, -exec -rfv {} \;ancak bu rmher dosya için çok fazla çalışma yapar) .

Bunu doğru klasörde kullanın. Aksi takdirde, kat adı ile değiştirin ..


Oh, nitpick modundayken: üçüncü komut her dosya için bir rm komutu yürütecek. Asma ++. Sen o aza indirebilirsiniz {} +(yaklaşık ikinci paragrafa bakınız -exec içinde man find).
Hennes,

@Hennes Üzerinde yakalamak için teşekkürler -print0. Genel giderini biliyordum -exec. Bu yüzden tercih ederim xargs. {} +Gerçi hakkında bilmiyordum . Cevabımda değiştirdi. Teşekkürler.
Rik

Birkaç ay öncesine kadar {} + bölümünü kendim okuyamadım. Exec seçeneğini açıklayan iki paragrafa sahip olmak sadece birincisini okumama neden oldu. Şu anda aklımda oldukça taze olsa. :)
Hennes

@Hennes Ve Fedora 3'ümde (biliyorum ki ... ESKİ) kurulum çalışmıyor. Centos'umda işe yarıyor. Bu yüzden sadece {} +belirli bir sürüm ve üstü kullanmak mümkündür . Her zaman kılavuzu kontrol edin;)
Rik
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.