Dosyaları tekrar tekrar kaldırma


140

Herkes bir Mac dosyaları A Linux Server taşıdıktan sonra aldığınız sinir bozucu ._ ve .DS_Store dosyaları kaldırmak için bir çözümü var mı?

bir başlangıç ​​dizini belirleyin ve bırakın? / var / www / html / down gibi ...


Yinelenen bir IMO olmasa da, şuna bir göz
atmalısınız

Sorduğun şey olmasa da. Bunun daha iyi bir çözüm olduğunu iddia ediyorum: unix.stackexchange.com/questions/9665/…
Viktor

Yanıtlar:


169

dizine geçin ve şunu kullanın:

find . -name ".DS_Store" -print0 | xargs -0 rm -rf
find . -name "._*" -print0 | xargs -0 rm -rf

Test edilmedi, önce xargs olmadan deneyin!

Bulma işleminden sonra, önce dizine geçmek yerine dizini değiştirebilirsiniz.

find /dir/here ...

2
Sorusunun sormadığını biliyorum, ama asla hatırlayamıyorum: örneğiniz boşluklu dosya adlarını ele alıyor mu?
Grundlefleck

4
Evet, print0 ve -0 ila xargs bunun içindir. Normalde boşlukları doğru işlemez, ancak print0 ile satırın sonunda dosya adını null karakterle basar, bu durumda -0 ile xarg, boşluklara sahip olma şansı olmadan tam yol xargs'a geçmek için kullanır rm komutuna ikinci veya üçüncü bir parametre kullanılması gerçekten kötü olabilir!
X-Istence

7
@X: yeni bulgular -deletebunu kısaltabilecek bir eylemi destekler . @JT: Bu, yinelemeli olarak altında arama yapar .. Kaç dosya ve alt dizin olduğuna bağlı olarak ... sadece bunların yüklenmesini yasaklayamaz mısınız?
ephemient

1
-rHerhangi bir dizini silmek istemediğiniz için (özyinelemeli) bayrağını kullanmanız önerilmez.
Daniel Zohar

2
@IlmariKaronen: iyi bir nokta. Daha command rmiyi (daha doğrudan) bir çözüm olmaz mıydı? ("Doğrudan" derken, özellikle eldeki sorunla ve başka hiçbir şeyle ilgilenmez ve bu nedenle istenmeyen yan etkilere sahip olma olasılığı daha düşüktür ve ayrıca kodu korumak zorunda olan herkes için daha açıklayıcı olacaktır. daha sonra.)
iconoclast

93
find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete

86

Daha yeni bulgular şunları destekler -delete:

find . -name ".DS_Store" -delete

-printAyrıca silme işlemlerinin bir listesini almak için ekleyin .

Eğer güncel bir POSIX sisteminiz varsa komut sizin için çalışacaktır. En azından benim için OS X 10.8'de çalışıyor ve macOS 10.12'de (Mojave) test eden diğerleri için çalışıyor.

@ X-Istence'nin gönderisine yaptığı bir yorumda @ephemient'e teşekkür edin (kendi cevabını garanti etmek için yeterince yardımcı olduğunu düşündüm).


1
OSX 10.6'da da çalışır.
hoss

3
En temiz ve en basit çözüm, +1!
limist

6
@OneOfOne: Yorumumun dediği gibi, bunu @ ephemient'ten aldım. Bash'a yeni başlayan biri olarak, (belki de daha doğru) çözümünüzü daha az okunabilir ve kullanılabilir buldum. İşlevsel olarak aynı olabilirler ama bu sözdiziminin daha fazla netlik sağladığını düşünüyorum.
rattray

1
'.' findgeçerli çalışma dizinine varsayılan olarak recurses olduğu için gerekli değildir .
Tom Russell

Programın yeni sürümlerinde, dizin atlanabilir ve geçerli çalışma dizini ( wikipedia ) anlamına gelir. Hala .macOS 10.12'de (Sierra) ihtiyacınız var.
Dem Pilafian

18

Basit komut:

rm `find ./ -name '.DS_Store'` -rf
rm `find ./ -name '._'` -rf

İyi şanslar!


1
Harika çalışıyor. AMA bir uyarı, sadece bu rm -i bulguyu kullandım ./-name '* py'' -rf , which did NOT prompt me to delete files. you will need to take it on the end (i.e. -rfi`). Yedek senaryom için çok şükür.
ryanjdillon

1
Çok fazla dosya varsa bu hatayla -bash: /bin/rm: Argument list too long
Viktor

12
cd /var/www/html && find . -name '.DS_Store' -print0 | xargs -0 rm
cd /var/www/html && find . -name '._*' -print0 | xargs -0 rm

2
Bunu daha iyi sevdim çünkü "rm" bu özel görev için gerekli olmayan "-r" ye sahip değil.
lotsoffreetime

6

Bash yerine zsh'ye geçebilirsiniz. Bu, dosyaları dizin ağacındaki herhangi bir yerde eşleştirmek için ** kullanmanızı sağlar:

$ rm /var/www/html/**/_* /var/www/html/**/.DS_Store

Bunları şu şekilde de birleştirebilirsiniz:

$ rm /var/www/html/**/(_*|.DS_Store)

Zsh, bash eksik olan birçok özelliğe sahiptir, ancak tek başına geçiş yapmaya değer. Çoğu (muhtemelen tümü) linux dağıtımının yanı sıra cygwin ve OS X'te kullanılabilir.

Daha fazla bilgiyi zsh sitesinde bulabilirsiniz .


1
Olası bir sorun: xargs kullanmadığınızdan, komut satırı bağımsız değişken uzunluğu kısıtlaması ile karşılaşabilirsiniz. Ayrıca, Bash 4 de destekliyor **:-) (varsayılan olarak olmasa shopt -s globstarda ayarlanması gerekiyor)
ephemient

4
find . -name "FILE-TO-FIND"-exec rm -rf {} \;

Bulunan her dosya için exec kullanmak hızlı değildir. Onları yazdırmak ve daha sonra rm'yi bir kez çağırmak için xargs kullanmak daha hızlıdır.
X-Istence

3
Ancak, findonu destekleyen bir varsa, +xargs benzeri: find . -name "FILE-TO-FIND" -exec rm -rf {} +- (ayrıca, -exec
daha

3
Günümde hiç xargs yoktu. Ve her iki yönde yokuş yukarı, okula yürümek zorunda .......
Martin Beckett

3

"Thumbs.db" özyinelemeli silme örneği;

find . -iname "Thumbs.db" -print0 | xargs -0 rm -rf

Doğrulayan:

find . -iname "Thumbs.db"

Bu, geçerli yolun içinde "Thumbs.db" içeren girdileri görüntülememelidir.


Lütfen yanıtınızın silinmekte olanların bir listesini yazdırdığından emin olun ve birisinin neden kullanmak isteyebileceğini xargsve print0yerine execnedenlerini açıklayın (nedenleri vardır).
Josh Habdas

3

Bu cevaba -print ekleyerek neyin kaldırıldığını görmek daha iyidir

find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete -print

2

Bash 4.0 ++ 'nız varsa

#!/bin/bash
shopt -s globstar
for file in /var/www/html/**/.DS_Store /var/www/html/**/._ 
do
 echo rm "$file"
done

2
Her dosya için yeni bir rm kopyası çalıştırmak israftır.
X-Istence

2
@ X-Istence erken optimizasyon israf
Lucina

Özgünlük ve daha yeni bash yeniliklerinin kullanımı için seçildi.
Josh Habdas

1

Unutulmaması gereken birkaç nokta:

'-delete' özyinelemeli değildir. Yani .TemporaryItems (klasör) içinde dosyalar varsa, komut başarısız olur.

Mac'ler tarafından oluşturulan bu sinir bozucu dosyaların çoğu var: .DS_Store ._. DS_Store .TemporaryItems .apdisk

Bu komut hepsine hitap ediyor. Birden fazla eşleşme için tekrar tekrar bulmayı kaydeder.

find /home/foo \( -name '.DS_Store' -or -name '._.DS_Store' -or -name '._*' -or -name '.TemporaryItems' -or -name '.apdisk' \) -exec rm -rf {} \;

0

Bu ayrıca işe yarar:

sudo rm -rf 2018-03-*

burada, 2018-03- biçimindeki adlara sahip dosyaları silme (başka bir şey)

basit tut


Birisinin ne zaman bir komutla önek eklemek isteyebileceğini sudoveya rmcevabınızın bağlamında nasıl çalıştığını gösteren herhangi bir bilgi sunmazsınız.
Josh Habdas
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.