سؤال كيفية حذف جميع الملفات في دليل ما عدا البعض؟


أحتاج إلى حذف جميع الملفات في دليل ، ولكن استبعاد بعض منها. على سبيل المثال ، في دليل مع الملفات a b c ... zأحتاج إلى حذف الكل عدا u و p. هل هناك طريقة سهلة للقيام بذلك؟


119
2018-01-08 12:17


الأصل


الإجابات أدناه أفضل بكثير ، ولكن يمكنك فقط حفظ الملفات لحفظ القراءة فقط ، وحذف الكل ، ثم تغييرها مرة أخرى إلى أذوناتها الأصلية (طالما أنك لا تستخدم rm -f). يجب أن تعرف ما هي الأذونات التي يجب استعادتها ، ويجب عليك أن تعرف أنه لا يوجد شيء يحتاج إلى كتابة الوصول إليها أثناء العملية. هذا هو السبب في أن الإجابات الأخرى أفضل. - Joe
إذا كنت تريد أيضًا حذف الملفات المخفية shopt -s dotglob قبل الركض rm (...).


الأجوبة:


ما أفعله في هذه الحالات هو الكتابة

rm *

ثم اضغط على السيطرة+X،* إلى وسعت  * في جميع أسماء الملفات المرئية.

ثم يمكنني فقط إزالة الملفين اللذين أرغب في الاحتفاظ بهما من القائمة وأخيراً تنفيذ سطر الأوامر.


108
2018-01-08 12:18



أعتقد أن هذا يعمل فقط طالما قائمة الملفات التي * يتوسع أيضا لا تحصل على وقتا طويلا. : -} - Frerich Raabe
سيتبع Esc متبوعًا * أيضًا "*". - slowpoison
SantoshKumar: هذا لا يعقلني. سيعمل التوسيع دائمًا ، ولا يعتمد على الأمر الذي تريد استخدامه بعد ذلك. - Der Hochstapler
OliverSalzburg عذرا ، فإن الجمع هو مربكة قليلا. أعتقد أنك يجب أن تكتب مثل Ctrl + Shift + x + * - Santosh Kumar
SantoshKumar: ولكن هذا ليس الجمع. - Der Hochstapler


إلى rm الكل ما عدا u,p في bash فقط اكتب:

rm !(u|p)

يتطلب ذلك تعيين الخيار التالي:

shopt -s extglob

شاهد المزيد: glob - جريج ويكي


143
2018-01-08 12:34



يجب أن يكون لديك "extglobbing" نشط: shops -s extglob - sparkie
أنت بحاجه إلى shopt -s extglob، @لقطة. أيضا ، انها مجرد ملفات ، وليس أدلة ، وهذا هو السبب في أنني قمت بإزالة -rf خيارات في الأمر الخاص بك. - slhck
إذا كنت بحاجة إلى استبعاد ملف واحد من اختيار من الملفات ، حاول هذا: rm !(index).html. سيؤدي هذا إلى حذف جميع الملفات التي تنتهي بـ ".html" باستثناء "index.html". - mzuther


يمكنك استخدام find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! ينفي التعبير التالي
  • -name يحدد اسم الملف
  • -maxdepth 1 سيجعل عملية البحث الدليل المحدد فقط (find افتراضيا traverses الدلائل)
  • -type f سوف معالجة الملفات فقط (وليس على سبيل المثال الدلائل)
  • -delete سوف يحذف الملفات

يمكنك بعد ذلك ضبط الظروف التي تبحث في رجل صفحة من العثور عليها

تحديث

  • ضع في اعتبارك أن ترتيب عناصر التعبيرات مهم (انظر الوثائق)
  • اختبر الأمر أولاً باستخدام -print بدلا من -delete

    find . ! -name u ! -name p -maxdepth 1 -type f -print
    

68
2018-01-08 12:35



Dennis شكرا لقد قمت بتحديث الإجابة - Matteo
ترتيب المسندات أمر بالغ الأهمية هنا. إذا وضعت واحدة -delete بعد ذلك مباشرة . ستكون كارثة (ستحذف جميع الملفات في CWD) - Michał Šrajer
هذا يمكن كتابه اكثر find . -maxdepth 1 -type f -name '[^up]' -delete - kojiro
kojiro نعم ولكن فقط للملفات التي هي مجرد حرف واحد. مع أسماء أكثر تعقيدًا ، يمكن أن يكون التعبير المعتاد عبارة عن فوضى. - Matteo
find هو أفضل صديق لي ، خاصة عندما يكون هناك الكثير من الملفات إلى الكآبة - Terence Johnson


بسيط:

mv الملفات التي تريدها في الدليل العلوي ، rm الدليل ثم mv اعادتهم.


42
2018-01-08 12:22



Offcourse ، mv لهم دليل أعلى. حاول عدم mv لهم إلى دليل فرعي تقوم بحذفه ... - Konerak
Konerak: rm بدون -r لن تزيل الدلائل الفرعية. - reinierpost
سيؤدي ذلك إلى استبدال الملفات ذات الاسم نفسه في الدليل الوجهة - Matteo
إنني أهبط هذا لأنه لأنه يمكن أن يكون مفيدًا ، فهو أيضًا غير ذري ويزيل جميع الملفات من الدليل بفعالية خلال فترة زمنية قصيرة ؛ هذا لن يكون مقبولا إذا ، على سبيل المثال ، يتم مشاركة الملفات على الشبكة. - sam hocevar


تشبه إلى حد ما هذا الجواب ولكن لا توجد حاجة لخيارات خاصة ، بقدر ما أعرف ما يلي هو وظيفة "القديمة" التي تدعمها أي قذيفة (غامضة) / بن / ش تشبه (مثل bash ، zsh ، ksh ، الخ)

rm [^up]

15
2018-01-08 14:22



هذا يعمل من أجل أسماء ملفات 1 char. لأسماء أطول ، إجابة sparkie هي أفضل. - glenn jackman
ماذا سيكون من الخطأ في rm [^up]*؟ أفعل أشياء مشابهة بدلاً من ذلك. - α CVn
@ MichaelKjörling - سيؤدي ذلك إلى حذف جميع الملفات التي تبدأ بـ u أو p ، وليس فقط تلك التي تحمل أسماء u و p. أعتقد أن OP (Ashot) تعني a-z و u ، p ، إلخ. رمزيًا وليس حرفيًا. - Sudipta Chatterjee
HobbesofCalvin التي من شأنها أن تحذف جميع الملفات ليس تبدأ بـ u أو p ، ولا تبدأ بتلك النقاط. - rjmunro
@ rjmunro - شكرا ، غاب عن ذلك! :) - Sudipta Chatterjee


القيام بذلك دون العثور على:

ls | grep -v '(u|p)' | xargs rm

(تحرير: "u" و "v" ، كما هو الحال في أماكن أخرى هنا ، يتم استخدامها كإصدارات عامة من regexes كامل. من الواضح أنك ستحتاج إلى توخي الحذر لترسيخ regexes الخاص بك لتجنب مطابقة الكثير من الأشياء.)

أنت بالتأكيد تريد نصًا إذا كنت ستفعل الكثير من هذا ، كما اقترح الآخرون.


11
2018-01-09 03:54



grep لن يعالج regexpt الموسعة بشكل افتراضي: إما استخدامها -E أو egrep - Matteo
هذا سيستبعد أي ملف يحتوي على u أو p - Matteo
Matteo لا لن يحدث ذلك. لا grepping grepping الملفات ، فإنه grepping إخراج الأمر ls. كنت أفكر في شيء من هذا القبيل grep -L (u|p)' * | xargs rmأين -L تعني قائمة أسماء الملفات التي لا تحتوي على تطابق. - rjmunro
يعني أي ملف يحتوي على اسم u أو pوليس أي ملف يحتوي على u أو p. هذا صحيح. يمكنك تحديد باستخدام egrep -v '^(u|p)$' - rjmunro
هنا إزالة كل شيء ما عدا هذه المباريات! ls | grep -v 'vuze\|progs' | xargs rm -rf - Nick


في zsh:

setopt extended_glob  # probably in your .zshrc

ثم

rm ^(u|p)

أو

rm *~(u|p)

الثانية ستعمل حتى لو كان لديك ^ في $histchars لاستبدال التاريخ ، وبالطبع يمكنك وضع تعسفي غلوب قبل ~.


6
2018-01-09 22:34





يأخذ GLOBIGNORE قائمة مفصولة بفواصل النقطتين

GLOBIGNORE=u:p
rm *

5
2018-01-08 16:32



هذا لا يعمل على صدري (جنو باش 4.1.5 (1)). تأكد من اختباره أولاً مع شيء أقل ضررًا من rm أو في دليل الاختبار! - α CVn


بالعودة إلى الحقبة المرنة كان عندي دوس قابل للتنفيذ يدعى "باستثناء" من شأنه أن يحرك الأشياء من الدليل الحالي مؤقتًا وينفذ أمرًا ، لذلك يمكنك أن تقول:

باستثناء * .txt del *. *

لحذف كل شيء ما عدا ملفاتك النصية.

قد يكون هذا شيئًا تافهًا جدًا لتنفيذه كبرنامج نصي للصدفة ، وإذا كان هذا هو الشيء الذي من المرجح أن تقوم به أكثر من مرتين ، يبدو أنها ستكون فكرة جيدة.


3
2018-01-08 17:02



ذكرني نفس الشيء. ولكن الانتقال مؤقتًا من المجلد قد لا يكون فكرة جيدة في عصر تعدد المهام :) - Sedat Kapanoglu


 find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

سيؤدي هذا إلى حذف جميع الملفات باستثناء u و p في unix


3
2018-01-08 17:58





لأولئك الذين يفضلون تحديد أنماط الاستبعاد التعسفي المعقدة (التي تشمل جميع أسماء الملفات المتأثرة) في emaxs regexp كاملة ، نمط posix-awk أو posix-extended (انظر صفحة العثور على رجل) أود أن أوصي بهذا. يستثني u و p في دير الحالي في هذا المثال. قد يكون هذا مفيدًا للنصوص البرمجية.

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf

2
2018-01-08 18:16



يجب تحديد دليل قبل التعبير (`find. -regextype ...). - Matteo
-regextype سوف تعمل فقط على إصدارات جنو - Matteo
لا - لا يحتاج إصدار البحث الخاص بي (ضغط debian) بشكل نهائي إلى دليل واضح قبل التعبير إذا كان يجب استخدام الدليل الحالي - sparkie
sparke: هذا يعمل فقط على تطبيقات جنو - Matteo
sparkie: عدم تحديد الدليل (المعلمة الأولى) لـ find هو امتداد جنو find أمر. وينطبق الشيء نفسه على -regextype اختيار. بالإضافة إلى ذلك ، سيحذف الأمر الخاص بك الملفات الموجودة في الدلائل الفرعية أيضًا ، في حين يطرح السؤال الأصلي بوضوح حول الملفات في الدليل. - Mikko Rantalainen