Bir rm -rf dosyasından kaldırılan bayt miktarını nasıl eko edebilirim?


1

Takma adım var

alias binobj="find . -iname "bin" -o -iname "obj" | xargs rm -rf"

Diskim neredeyse dolduğunda kullanıyorum. Bu, geçerli klasörden tekrar tekrar arayarak, "bin" ve "obj" klasörlerini siler.

Silinen tüm dosyaların toplamını nasıl bildiğimi bilmek istiyorum. Bir boru aracılığıyla 2 komut arasına bir yankı koymaya çalıştım, ancak daha sonra xargssilinecek dosyaları almayacak.

Mac'imdeyim ama paket eklemek konusunda utangaç değilim. Sadece bunu başka bir dosyaya koymak istemiyorum (bu benim .bash_profile), bu diğer mac'larım ile senkronize oluyor.

Yanıtlar:


1

Özyinelemeli bir buluntu yaparken çok dikkatli olmak isteyeceksiniz binve obj... örneğin, .../.hg/store/data/objiyi bir fikir olmayacak önemli dosya veya dizinleri kazara açabilirsiniz (örneğin :).

Mümkün olan her yerde, olabildiğince hassas olmak istersiniz. Dizinleri kaldırmaya çalışıyorsanız, -type dyanlışlıkla bir dosya / symlink / etc ile eşleşmeyecek şekilde belirtin ...

Ek olarak, bu okunabilirlik / bakım kolaylığı için bir dizi işlev olarak fayda sağlayacağı kadar büyüktür.

Bu işlev kümesi (ve nihayet diğer adı değiştirilebilen / işleve sokulabilen bir boru hattı), bir dosyanın yanındaki tüm dizinleri binve tüm objklasörleri kaldıracaktır makefile(tümü büyük / küçük harf duyarlı). Toplam bayt, " " gibi bir çıktı almak stderriçin utangaç kullanarak yazılacaknumfmt9.1MB

function getMakefiles {
    find . -type f -iname makefile
}

function getBinObjDirsNear {
    while read NEAR; do
        find $(dirname ${NEAR}) -type d -maxdepth 1 \( -iname bin -o -iname obj \)
    done
}

function calcTotal {
    TOTAL=0
    while read ENT; do
        TOTAL=$(( TOTAL + $(du -bc ${ENT} | tail -n 1 | cut -f 1) ))
        echo ${ENT}
    done
    numfmt --to=iec --suffix=B --format="%f" ${TOTAL} >&2
}

getMakefiles | getBinObjDirsNear | calcTotal | xargs -d '\n' rm -rf

Hiçbir şeyin kırılmayacağından emin olmak için obj bin klasörlerinin yanında bir makefile olup olmadığını kontrol etmek gerçekten iyi bir fikirdir. Komutu daha önce yürüttüm, ama muhtemelen bunu yapmayı bırakmak iyi bir fikir. Makefile'ı kontrol etmek için kullanamıyorum, ancak klasörlerin yanında olacağı çözüm ve proje dosyalarını kullanabilirim.
user1009013

1

Sadece klasörleri kaldırmadan önce boyutunu hesaplardım:

alias binobj="du -sc bin/ obj/ | grep total ; find . -iname "bin" -o -iname "obj" | xargs rm -rf"

Komut , mevcut dizindeki bin+ objdizinlerinin bayt cinsinden eklenen boyutunu ister ; daha sonra silmek için yürütün.

Düzenleme : Yoruma göre: binve objyinelemeli olarak bulunmalıdır:

Zarif bir çözüm bulmak için fazla zaman harcamadan, her dizinin boyutunu çıkarmadan önce günlüğe kaydeder ve temizleme tamamlandıktan sonra hesaplardım. Kirli bir astar:

find . -iname "bin" -o -iname "obj" | xargs -I % sh -c "du -sb % >> /tmp/delreport.log; rm -rf %"; awk '{sum+=$1} END {print sum}' /tmp/delreport.log && rm /tmp/delreport.log

  • | xargs -I % sh -c "..." : \% parametresiyle birden çok komut girmenize olanak verir
  • du -sb : kaldırılacak havuzun boyutunu size kaydeder
  • awk '{sum+=$1} END {print sum}' : raporun ilk sütununda tüm boyutu topla

Neredeyse iyi olduğunu düşünüyorum, ancak du özyinelemeli değil, bu yüzden bütün projelerimi temizlemek için bazen projeler klasörümden çalıştırıyorum.
user1009013

@ user1009013 Dizinleri yinelemeli bulmanız gerektiğine göre bazı bilgiler ekledim
Esteban
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.