Rm boş dizinleri özyinelemeli olarak kaldırabilir mi?


9

Unix'in eski bir sürümünde, rmkomut boş olsaydı dizinleri silerdi. Rm için Research Unix Sekizinci Baskı kılavuz sayfasından : "Bir girdi bir dizinse, yalnızca boşsa kaldırılır." Ben bu davranışı seviyorum, bu yüzden bu takma adı var /etc/profile: alias rm='rm -d'GNU coreutils sürümünü kullanıyorum, rmhangi devam etmeli ve boşsa dizinleri kaldırmayı -dsöyler rm.

Çok uzak çok iyi. Bu takma ad rmeski günler gibi kullanmamı sağlıyor . Ancak, bir adım daha ileri gitmek istiyorum. isterim kirmdizin başka dizinler içeriyor olsa bile, bir dizin silmek için dizinler tek şey olduğu sürece. Dizin yapısının ne kadar derine gittiği önemli değil, orada herhangi bir dosya olmadığı sürece, sadece boş (altta bir kez olsun) dizinler, rmhepsini kaldırmak istiyorum .

Bu, normal olarak işlev görecek rmve kendisine aktarılan dosyaları silecek bir takma ad olarak yazılabilir mi?


Nasıl rmdir -p?
Kevin

Öneri için teşekkürler Kevin, ama bu aradığım davranış değil. Eğer mkdir -p a/b1/c2 && mkdir -p a/b2/c2; rmdir -p a/b1/c1;koşarsam, hala a, a / b2 ve a / b2 / c2 ile kalırım. İstediğim sadece en üst seviyeyi (bu durumda bir) geçmek rmve altındaki her şeyi kaldırmaktır.
WhiteHotLoveTiger

Yanıtlar:


8

Bir dizin ağacında gezinmek ve dizin dışında bir şey içerip içermediğini görmek istiyorsunuz. Bu rmyeteneklerin ötesindedir . Gibi başka araçlara ihtiyacınız var find. Belirli bir dizinin altındaki boş dizinleri bu şekilde silebilirsiniz (boş -depthhale gelen üst dizinlerin de silinmesine neden olur):

find "$x" -depth -type d -exec rmdir {} +

Burada, her bağımsız değişken için, dizin olmayan bir dosya veya dizinler dışında herhangi bir şey içermeyen bir dizin ağacı olması durumunda bağımsız değişkeni silen bir işlev vardır. Bu işlevin atomik olmadığını unutmayın: değişkenlerden biri çalışırken değişkenlik gösterirse, bir hata mesajı alabilirsiniz, ancak argüman olarak iletilen bir dizin içindeki herhangi bir dizini silmemesi güvenlidir.

rm () {
  ret=0
  for x; do
    case $x in -*) x=./$x;; esac
    if [ -d "$x" ]; then
      if [ -n "$(find "$x" ! -type d | head -n 1)" ]; then
        echo 1>&2 "$x: non-empty directory tree"
        ret=2
      else
        find "$x" -depth -exec rmdir {} +
        if [ -d "$x" ]; then ret=2; fi
      fi
    else
      command rm "$x" || [ $ret -gt 1 ] || ret=2
    fi
  done
  return $ret
}
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.