البقرى متعددة إلى 1 البقرى؟ ينبغي لي أن تغييره وكيف يمكنني؟

StackOverflow https://stackoverflow.com/questions/1614035

  •  06-07-2019
  •  | 
  •  

سؤال

وهذا هو بلدي النصي النهائي

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy." | xargs svn add 2>/dev/null

لاختبار أنا لا أميل لإضافته إلى SVN حتى يمكنني استخدام

find -regex "^\..*[^(~$|\.o$|\.exe)]" | grep -v "\.svn" | grep -v ".tab." | grep  -v ".yy."

ملحوظة: أردت أن تجاهل الملفات التي بدأت مع '.' (في تيار والفرعية) ولكن لم أستطع معرفة كيفية ذلك أنا استقر ل.svn

وحاولت إزالة greps إضافية لإنتاج التعابير المنطقية واحدة ولكن لحياة لي لم أستطع الحصول عليه لتجاهل .svn (أو .FILE) في المجلدات الحالية والفرعية، وأنا لم أستطع الحصول عليه لتجاهل .tab. أو .yy.

ومشكلة واحدة هي لم أستطع فهم كيفية جعل ^. (تجاهل إذا تبدأ؟) العمل. أنا متأكد من مشكلة واحدة هي حقيقة أن أفعل. * الذي سيتم تجاهل بلدي .tab. حكم وأنا غير متأكد من كيفية التفاف.

هل كانت مفيدة؟

المحلول

وجذور المشكلة لديك هو أن كنت تعتقد أنك تستطيع أن تفعل هذا:

[^(~$|\.o$|\.exe)]

وأنت لا تستطيع ذلك.

في فئة حرف (هذا ما لديك هنا) يمكنك تضمين (أو استبعاد) الأحرف الفردية، ولكن لا يمكنك كتابة التعبيرات هناك. ما سبق هو ما يعادل (بقدر محرك رجإكس قلقة) إلى:

[^()~$|.oex]

وأنا على ويندوز، لذلك لا أستطيع أن أعطيكم أمر اختبارها، ومشاركتك يترك لي قليلا في حيرة الملفات التي تريد فعلا. لذلك هذا هو المقصود كمؤشر في الاتجاه الصحيح بشأن سوء فهم التعابير المنطقية الخاصة بك.

نصائح أخرى

<اقتباس فقرة>   

ملحوظة: أردت أن تجاهل الملفات التي بدأت مع '.' (في تيار والفرعية) ولكن لم أستطع معرفة كيفية ذلك أنا استقر ل.svn

     

ومشكلة واحدة هي لم أستطع فهم كيفية جعل ^. (تجاهل إذا تبدأ؟) العمل. أنا متأكد من مشكلة واحدة هي حقيقة أن أفعل. * الذي سيتم تجاهل بلدي .tab. حكم وأنا غير متأكد من كيفية التفاف.

ويتم تطبيق الاختبار -regex على find إلى المسار الكامل، وليس فقط اسم الملف. من الصفحة رجل:

<اقتباس فقرة>   

وعلى سبيل المثال، لمطابقة ملف اسمه './fubar3 "، يمكنك استخدام التعبير العادي. * شريط". أو ". * ب * 3"، ولكن ليس "و. * R3".

والجواب soulmerge ويوفر طريقة واحدة للحصول على كل شروطكم في بيان اكتشاف. يمكنك أيضا أن تفعل ذلك مع شيء من هذا القبيل

find * -regex 'include-pattern' -a ! \( -regex 'exclude-pattern' [-o 'exclude-pattern2' ...] \)

إذا كنت ترغب في الجمع بين أنماط متعددة لاستبعاد، سواء في greps بالأنابيب أو في regexes الاكتشاف، ومجرد استخدام أو:

grep -v '\.svn\|.tab.\|.yy.'
egrep -v '\.svn|.tab.|.yy.'

لاحظ أن انها فكرة جيدة للغاية لاستخدام علامات الاقتباس المفردة لالتعابير المنطقية - كنت لا تريد أي $ لمحاولة توسيع متغير

وتحرير: تلك استبعاد الأنماط التي كنت تشير في الحقيقة لا تحتاج إلى أن تكون التعابير المنطقية. يمكنك الحصول عليها فقط مع -اسم، والذي يطابق فقط الاسم الفعلي، وليس الطريق كله.

find * -regex 'include-pattern' -a ! \( -name .svn -o -name "*tab*" \)

ويمكن أن أقول لكم find إلى تجاهل بعض المجلدات ومحتوياتها مع -prune. ولا تحتاج تعبير عادي هنا، الأوامر العثور أخرى كافية تماما. إذا كنت تريد أن تكون قادرة على التعامل مع أسماء الملفات مع مسافات، وأود أن زيادة استخدام -print0. وتلخيصا، وهذا ينبغي أن تفعل ما تريد:

find . \( -name ".*" -prune \) -or \
    -name "*.exe" -or -name "*.o" -or -name "*~" \
    -print0 | xargs -0 svn add

وأنا لست متأكدا 100٪ ما تريد تحقيقه ولكن find -regex '^.*/[^.].*' يجب أن تعمل (مع أي حرف غير نقطة في بداية الاسم).

والبقرى يدعم أنماط متعددة. منها مثلا:

grep -v -e "\.svn" -e ".tab." -e ".yy."
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top