Komut satırı: borulama sonuçları rm'ye bulur


140

15 günden daha eski sql dosyalarını silen bir komut üzerinde çalışıyorum.

Bul bölümü çalışıyor ama rm değil.

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f  \( -name '*.sql' \) -mtime +15

Tam olarak silinmesini istediğim dosyaların bir listesini çıkarır ancak silmez. Yollar doğru.

usage: rm [-f | -i] [-dIPRrvW] file ...
       unlink file
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql
...
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql

Neyi yanlış yapıyorum?

Yanıtlar:


274

Aslında Borulama rm'ın çıkışını girişine find. İstediğin çıktısını kullanmaktır findolarak argümanlar için rm:

find -type f -name '*.sql' -mtime +15 | xargs rm

xargsstandart girdisini başka bir programın argümanlarına "dönüştüren" veya mansayfaya daha doğru bir şekilde koydukları için ,

standart girdiden komut satırları oluşturma ve yürütme

Dosya adları boşluk karakterleri içeriyorsa, bunu düzeltmeniz gerektiğini unutmayın:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm

Ama aslında, findbunun için bir kısayol var: -deleteseçenek:

find -type f -name '*.sql' -mtime +15 -delete

Lütfen aşağıdaki uyarılara dikkat edin man find:

  Warnings:  Don't  forget that the find command line is evaluated
  as an expression, so putting -delete first will make find try to
  delete everything below the starting points you specified.  When
  testing a find command line that you later intend  to  use  with
  -delete,  you should explicitly specify -depth in order to avoid
  later surprises.  Because -delete  implies  -depth,  you  cannot
  usefully use -prune and -delete together.

Not: Doğrudan girişin rmbir seçenek olmadığını unutmayın , çünkü rmstandart girişte dosya adları beklemez. Şu anda yaptığınız şey onları geriye doğru pipetlemek.


1
Teşekkürler. Adam sayfasını okudum ve o bayrağı denedim. Ben tam bir yol geçiyorum ama "/ usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups /: göreceli yol potansiyel olarak güvenli değil" alıyorum. Neden olduğu hakkında bir fikrin var mı?
jerrygarciuh

1
@jerrygarciuh buraya bir bakın .
Lev Levitsky

Teşekkürler. Gönderiyi iyi takip ettiğimden emin değilim ama çözümlerini taklit ettiğimde ve komutun sonuna -delete koyduğumda, mod süresinden bağımsız olarak tüm sql dosyalarını sildi ... ama uyarı yoktu bu yüzden sanırım bu ilerleme ...
jerrygarciuh

1
@jerrygarciuh Ah, umarım değerli bir şey kaybolmaz ... mandiyor ki: When testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid later surprises.Kullandığın diğer seçenekler göz önüne alındığında bunun nasıl bir şey olacağından emin değilim, ama denedin mi?
Lev Levitsky

Hayır yapmadım ama hiçbir şey kaybolmadı. Bu dosyalar, depolandıkları başka bir sunucudan yeniden senkronize edilir.
jerrygarciuh

26
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

/usr/www/bar/htdocs15 günden daha eski dosyaları seçer ve kaldırır.


Cevabınızı "isimdeki boşluk" nedeniyle kabul edilenden daha çok tercih ediyorum. "-Exec" komutuyla borudan daha iyi işlenir. Teşekkürler.
İnce Aloui

3

Başka bir basit yöntem locatekomut kullanmaktır . Ardından sonucu boruya ekleyin xargs.

Örneğin,

locate file | xargs rm

2

* .Sql yedek dosyalarını içeren dizinde olmadığınızı varsayarsak:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;

Yukarıdaki -v seçeneği, hangi dosyaların kaldırıldıkça silindiğini ayrıntılı bir şekilde çıkarır.

Emin olmak için önce silinecek dosyaları listelemeyi seviyorum. Örneğin:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
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.