~ İle biten geçici dosyaları silme komutu


15

Birkaç gün önce, bu yararlı bash takma adını buldum ( ~ / .bash_aliases'imin içeriği )

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

Şimdi kullanmaya çalıştı rm~sonra cdbiten 3 dosyalarını içeren bazı dizine~

Terminalde bu hatayı aldım ve dosyalar silinmedi

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Denedim Ayrıca rm~gelen /home/me, hiçbir şey yapıyor gibi görünüyor. Veya çok zaman alıyor olabilir.

Lütfen neden hata alıyorum ve nasıl düzeltilebileceğini söyle.

Teşekkürler!

Yanıtlar:


26

Bash takma adınız iyi yazılmamış (tek tırnaklar iyi kullanılmamış). Bunun yerine şöyle olmalıdır:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

Şimdi, kişisel olarak boruların yararsız kullanımını sevmiyorum ve xargsbu yüzden takma adınız daha iyi yazılacaktı:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

-type fSeçeneği yalnızca dosyaları (değil vb dizinleri, bağlantı,), bulmak amacıyla -vseçeneği rmayrıntılı (Ne 's silme dışarı baskılar) ettirilebilir şekilde. +Sonunda böylece findçalışır rmbulunan tüm dosyaları ile (yalnızca bir örneği yumurtlar rm, yerine dosya başına bir).

Şimdi man bash:

Neredeyse her amaç için takma adların yerini kabuk işlevleri alır.

Bir takma ad yerine, bir işlev kullanmak daha iyidir: takma adınızı .bash_aliasesdosyaya yorumlayın (yani, #bu satırın önüne bir koyun ) ve dosyaya .bashrcbu fonksiyonu koyun (dosyanın herhangi bir yerinde, sonunda iyi) :

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

Ayrıca, diğer cevaplarda belirtildiği gibi, -deletebulmak için komutu kullanabilirsiniz. Bu durumda, rm~işleviniz şöyle olacaktır:

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

Aslında, --dry-runsadece sildiğini çıktılayacak bir argüman alacak olan harika bir işlev yapabilirsiniz :

rm~() {
    case "$1" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

Sonra şöyle kullanın:

rm~ --dry-run

yalnızca silinecek (ancak silinmeyecek) dosyaları göstermek için

rm~

bundan memnun olduğunuzda.

Uyarlayın ve ihtiyaçlarınıza göre genişletin!

Not. Değişikliklerin geçerli olması için yeni bir terminal açmanız gerekecek.


Teşekkürler! Güzel çalışır ve kuru çalışma son derece yararlıdır.
Vinayak Garg

2
find -type f -name '*~' -delete(yanında Tercih silahı, git clean -dfx .)
sehe

2
Bu çok zarif bir çözüm, sadece size sahne vermek için giriş yapmam gerekiyordu. +1 sana, iyi dostum!
CodeChimp

9

*~takma adınıza atanmadan önce kabuk tarafından genişletilir. Gerçek ödev:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

Takma adlar yerine işlevleri kullanmanızı öneririm, bunlar tırnaklarla ilgili olarak çok daha güçlü ve kullanımı daha kolaydır.

Biz oradayken gereksiz .olanı kaldırın (herhangi bir parametre verilmemişse geçerli dizin ima edilir) ve xargsbir -deleteseçenek zaten mevcut olduğundan kötüye kullanmayı bırakın .

rm~() { find -name '*~' -ls -delete; }

-lsSeçenek isteğe bağlıdır, ancak eklemeden dosyalar silinmiş olan size gösterecektir.


+1 Teşekkürler! Ancak bu işlevi nereye eklerim?
Vinayak Garg

@VinayakGarg Siz de ekleyebilirsiniz .bash_aliases, ama genellikle onları doğrudan benim yerime koyarım .bashrc.
Lekensteyn
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.