unix نساء سطر الأوامر: piping العثور على النتائج إلى جمهورية مقدونيا




نساء مقدونيا (4)

أحاول عمل أمر يحذف ملفات SQL أقدم من 15 يومًا.

جزء البحث يعمل ولكن ليس rm.

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

إنه يخرج قائمة بالضبط بالملفات التي أريد حذفها ولكن لا يتم حذفها. المسارات صحيحة.

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

ما الخطأ الذي افعله؟


بافتراض أنك غير موجود في الدليل الذي يحتوي على ملفات النسخ الاحتياطي * .sql:

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

الخيار -v أعلاه مفيد سيكون بإخراج الملفات التي يتم حذفها عند إزالتها.

أود أن قائمة الملفات التي سيتم حذفها أولا للتأكد. على سبيل المثال:

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

طريقة أخرى أبسط هي استخدام locate القيادة. استخدامه xargs .

فمثلا،

locate file.txt | xargs rm
locate *something* | xargs rm

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

سيتم تحديد الملفات في /usr/www/bar/htdocs الأقدم من 15 يومًا وإزالتها.


أنت في الواقع piping rm 's الإخراج إلى إدخال find . ما تريده هو استخدام إخراج find كوسيطة لـ rm :

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

xargs هو الأمر الذي "يحول" مدخلاته القياسية إلى حجج من برنامج آخر ، أو ، لأنها تضعها بدقة أكبر في صفحة man ،

بناء وتنفيذ خطوط الأوامر من المدخلات القياسية

لاحظ أنه إذا كانت أسماء الملفات يمكن أن تحتوي على أحرف بيضاء ، فيجب تصحيح ذلك:

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

ولكن في الواقع ، find أن هناك اختصارًا لهذا الخيار: الخيار -delete :

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

يرجى الانتباه إلى التحذيرات التالية في 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.

ملاحظة: ملاحظة أن المواسير مباشرة إلى rm ليست خيارًا ، لأن rm لا تتوقع أسماء ملفات على الإدخال القياسي. ما تقوم به حاليا هو توصيلها للخلف.





rm