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.