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.
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:
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
-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.
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
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 ..
{} +(yaklaşık ikinci paragrafa bakınız -exec içinde man find).
-print0. Genel giderini biliyordum -exec. Bu yüzden tercih ederim xargs. {} +Gerçi hakkında bilmiyordum . Cevabımda değiştirdi. Teşekkürler.
{} +belirli bir sürüm ve üstü kullanmak mümkündür . Her zaman kılavuzu kontrol edin;)
-maxdepth 1, yoksa bu 'geçerli çoklu sözdizimi' şeylerinden biri mi?