سؤال كيف يمكنني بشكل متكرر حذف جميع ملفات الامتداد المحدد في الدليل الحالي؟


كيف أحذف جميع الملفات بامتداد محدد بأمان (على سبيل المثال ، .bak) من الدليل الحالي وكافة المجلدات الفرعية باستخدام سطر أوامر واحد؟ ببساطة ، أخشى استخدامه rm منذ أن اعتدت عليه مرة واحدة والآن أنا بحاجة إلى المشورة.


421
2017-11-15 13:03


الأصل




الأجوبة:


لا تحتاج حتى إلى استخدام rm في هذه الحالة إذا كنت خائفا. استعمال find:

find . -name "*.bak" -type f -delete

لكن استخدامها مع الاحتياطات. شغِّل أولاً:

find . -name "*.bak" -type f

لترى بالضبط الملفات التي ستقوم بإزالتها.

أيضا، تأكد من أن -delete هي الحجة الأخيرة في الأمر الخاص بك. إذا كنت وضعت قبل -name *.bak argument، سيحذف كل شيء.

نرى man find و man rm لمزيد من المعلومات ، راجع أيضًا هذا السؤال المتعلق بـ SE:


660
2017-11-15 13:08



كيف يختلف هذا عن rm *.bak؟ - sayantankhan
@ Bolt64 الخاص بك rm *.bak لن يعمل للدلائل الفرعية. - Radu Rădeanu
مع الإعدادات الافتراضية rm *.bak سيحذف فقط كل الملفات التي تنتهي بـ .bak في الدليل الحالي. للقيام بأشياء في الدلائل الفرعية التي تحتاج إليها للتلاعب بالكرات ، استخدم خيار -r أو استخدم مثال البحث. - Hennes
Hennes كن حذرا مع rm -r *.bak! كما أنه يزيل الدلائل التي تنتهي في .bak مع كل محتواها. - Radu Rădeanu
تأكد أن -delete هي الحجة الأخيرة في أمرك. إذا كنت وضعت قبل -name *.bak جدال، سيحذف كل شيء. - Michael


find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

32
2018-04-04 19:10



مرحبا بك في askubuntu! في حين أن هذا هو جواب صحيح تماما لا أعتقد أن هناك أي ميزة في استخدام هذا بدلا من -delete علم من find. مزيد من المعلومات يمكن العثور عليها في غنو أدلة إدخال لحذف الملفات مع البحث. - Glutanimate
ربما أنت على حق ، إنه مجرد حل بديل ، ربما أكثر الخام ؛) - lokers
هذا ليس مجرد بديل ولكن مثال على كيفية الجمع بين الأوامر الأخرى مع الأنبوب "|". +1 - Boris Pavlović
تعمل هذه الحلول البديلة على بيئات أخرى تفتقر إلى الحذف (مثل cygwin) - ciriarte
أعتقد أن هذا هو أفضل إجابة هنا. - Léo Léopold Hertz 준영


أولا قم بتشغيل الأمر shopt -s globstar. يمكنك تشغيل ذلك في سطر الأوامر ، وسيكون له تأثير في نافذة shell فقط. يمكنك وضعها في حياتك .bashrc، وبعد ذلك جميع القذائف التي بدأت حديثا سوف تستلمها. تأثير ذلك الأمر هو **/ تطابق الملفات في الدليل الحالي والدلائل الفرعية بشكل متكرر (افتراضيًا ، **/ يعني نفس الشيء */: فقط في الدلائل الفرعية المباشرة). ثم:

rm **/*.bak

(أو gvfs-trash **/*.bak أو ماذا لديك).


28
2017-11-15 18:59





حذف الملفات لي ليس شيئًا يجب عليك استخدامه rm إلى عن على. هنا هو البديل:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

كما يقول Flimm في التعليقات:

حزمة trash-cli يفعل الشيء نفسه gvfs-trash دون الاعتماد على gvfs.

وبالتالي:

sudo apt-get install trash-cli

لا تحتاج إلى إنشاء اسم مستعار لهذا ، لأن trash-cli حزمة توفر القيادة trashالذي يفعل ما نريد.

كما توضح إيليا كاغان في تعليقات موسعة ، يمكنك أيضًا استخدام هذا التكرار find. في هذه الحالة ، لا يمكنك استخدام اسم مستعار ، لذلك تفترض الأوامر أدناه أنك قمت بتثبيتها trash-cli. ألخص تعليقات إيليا:

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

find . -name '*.bak' -xtype f

لحذفها ، إلحاق -exec مع ال trash أمر:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f يحدد الملفات والرموز إلى الملفات ، ولكن لا المجلدات. لحذف مجلدات .bak أيضًا ، أزل هذا الجزء واستخدمه -execdirالذي يتجنب cannot trash non-existent أخطاء لـ .bak الملفات في الداخل .bak الدلائل:

find . -name '*.bak' -execdir trash {} +

19
2017-11-15 13:52



"لا تستخدم rm لحذف الأشياء "هو بيان مثير للجدل ولكن يجب أن أوافق على أنه من الحكمة في كثير من الأحيان استخدام شيء من شأنه أن يتيح لك التراجع عن الأشياء. - Oli♦
حزمة trash-cli يفعل الشيء نفسه gvfs-trash دون الاعتماد على gvfs. - Flimm
لقد قمت بتحريره في الإجابة ، في المرة القادمة لا تتردد في القيام بالتعديل بنفسك. - don.joey
@ don.joey يبدو أن هذه الإجابة تقول find . -name "*.bak" -type f يعرض ما trash *.bak حذف. هل هذا حقا ما تقصد؟ يمكنك نقل الدلائل إلى سلة المهملات trash أو gvfs-trash، لكن trash *.bak سينقل الملفات والأدلة التي تنتهي أسماؤها فقط .bak وتوجد على الفور في الدليل الحالي. توسع القشرة *.bak، وبالتالي trash *.bak لن يؤثر .bak الملفات في الدلائل الفرعية ليسوا أنفسهم اسمه .bak. - Eliah Kagan
@ don.joey نعم ls *.bak (والتي أعتقد أنك تقصد) يسرد ماذا trash *.bak trashes. find . -name '*.bak' -xtype f -exec trash {} + القمامة كل شيء .bak الملفات في أي مكان تحت .. لا يمكن استخدام اسم مستعار ، لذلك التثبيت trash-cli أو الكتابة gvfs-trash في حين أن. وهنا مثال على ذلك.  -xtype f يحدد الملفات والرموز إلى الملفات ، ولكن لا المجلدات. لحذف .bak  المجلدات أيضا ، استخدم find . -name '*.bak' -execdir trash {} +الذي يتجنب cannot trash non existent أخطاء لـ .bak الملفات في الداخل .bak الدلائل. لا تتردد في استخدام أي من هذا في إجابتك. - Eliah Kagan


إذا كنت تريد حذف جميع الملفات من نوع معين ، ولكن فقط "مجلد" واحد فقط من المجلد الحالي:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 لأن الدليل الحالي "."يتم اعتباره المجلد الأول.


3
2017-11-26 17:21





إذا كنت داخل git repo ، فيمكنك استخدام:

git clean -fdx

هذا حذف الملفات والملفات untracked في .gitignore.


0
2017-08-09 07:38