Terminal: Belirli uzantıyı yinelemeli olarak kaldır


1

Başka birçok klasör içeren bir klasörüm var.

Diyelim ki içerdiği klasörlerin bazıları (isteğe bağlı derinliklerde) belirli bir uzantıya sahipler. .ext:

TopFolder
+ Folder1
| + Folder11.ext
|   +Folder111
+ Folder2.ext

Bu uzantıyı herhangi bir alt klasördeki tüm klasörlerden kaldırmak için Terminal'i kullanmak istiyorum.

TopFolder
+ Folder1
| + Folder11
|   +Folder111
+ Folder2

Find ve Xargs'la oynadım ama işe yaramadı.

Yanıtlar:


1

Bunu dene:

$ find TopFolder -print
Topfolder
Topfolder/Folder1
Topfolder/Folder1/Folder11.ext
Topfolder/Folder1/Folder11.ext/Folder111
Topfolder/Folder2.ext
$ find TopFolder -name '*.ext' -print | while read i; do mv -v "$i" "${i%.ext}";done
$ find TopFolder
TopFolder
TopFolder/Folder1
TopFolder/Folder1/Folder11
TopFolder/Folder1/Folder11/Folder111
TopFolder/Folder2

İlk ve son buluntu sadece hiyerarşiden önce ve sonra göstermektir. İşte asıl işi yapan ortancanın nasıl çalıştığını şöyle gösterir:

$ find TopFolder -name '*.ext' -print

Bu, TopFolder'daki deseni eşleştiren her şeyi bulur '*.ext', .ext ile biten tüm dosya ve dizinler budur ve her birinin yolunu yazdırır. Yalnızca dizinlerle sınırlandırmak istiyorsanız, -type d.

while read i; do

read i standart girdiden kabuk değişkenine okur i. while kadar döngüler read i dosyanın sonunda yaptığı false değerini döndürür. Olmak find 'nın çıkışı, read 'nin standart girişi; find, yani read bir anda bir satır okuyacak find hiç kalmamış olana kadar çıktı.

mv -v "$i" "${i%.ext}"

Bu asıl adı değiştirir. -v içeride sadece ne olduğunu görebilirsin, istersen dışarıda bırakabilirsin. "$i" içindeki yolun herhangi bir öğesi durumunda alıntı yapılan kaynaktır. $i boşluk içerir. "${i%.ext}" Hedef $iherhangi bir iz .ext çıkarıldı.

done

Bu sadece while döngüsünü sonlandırır.

Bunun bash olduğunu, diğer oldukça modern kabuklarda yapılabilir olması gerektiğini unutmayın, ancak sözdizimi biraz farklı olabilir.


Harika cevap ve harika bir açıklama; çok teşekkür ederim!
fzwo

0

Bir satır içi komut dosyası ve parametre genişletme kullanabilirsiniz.

find . -type d -name '*.ext' -exec ksh -c 'for dir
    do mv "$dir" "${dir%.*}"
    done' _ {} +

Bu benim için işe yaramadı.
fzwo
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.