البقرى متعددة إلى 1 البقرى؟ ينبغي لي أن تغييره وكيف يمكنني؟
سؤال
وهذا هو بلدي النصي النهائي
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."