كيف يمكنني جعل "العثور على" أمر على OS X الافتراضي إلى الدليل الحالي؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

وأنا مستخدم سطر الأوامر الثقيلة واستخدام الأمر find على نطاق واسع في كتاباتي نظام بناء. ولكن على ماك OS X وأنا عندما لا تركز كثيرا ما كنت الحصول على إخراج مثل هذا:

$ find -name \*.plist
find: illegal option -- n
find: illegal option -- a
find: illegal option -- m
find: illegal option -- e
find: *.plist: No such file or directory

والأساس، وأنا نسيت أن أضيف قليلا النقطة:

$ find . -name \*.plist

ولأن BSD find يتطلب مسار وGNU find لا (أنه يفترض الدليل الحالي إذا لم تقم بتحديد واحد). يمكنني استخدام لينكس، ماك OS X وسيغوين في كثير من الأحيان كل في نفس الوقت، لذلك فمن ذا فائدة كبيرة بالنسبة لي أن يكون كل ما عندي من أدوات تتصرف نفس. حاولت كتابة وظيفة باش find الذي أضاف "./" إذا كنت قد نسيت، لكني فشلت. شكرا لمساعدتك. :)

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

المحلول

إذا كنت لا يمكن الانضباط نفسك لاستخدام find "بشكل صحيح"، ثم لماذا لا يتم تثبيت GNU find (من findutils) في دليل على PATH الخاص بك قبل الأمر نظام find.

واعتدت أن يكون لي الخيار خاص من cp التي من شأنها أن نسخ الملفات إلى الدليل الحالي إذا كان العنصر الأخير في القائمة ليس دليلا. ظللت أنه في بلدي دليل bin الشخصية لسنوات عديدة - ولكن إزالتها في نهاية المطاف لأنني لم تعد تستخدم وظيفة. (وقد كتب بلادي 'cp.sh "في عام 1987 وتحريرها مرتين، في عامي 1990 و 1997، وذلك كجزء من التغييرات على الرموز نظام التحكم في الإصدار. أعتقد أنني إزالته حول عام 1998. والمشكلة الرئيسية مع السيناريو هو أن cp file1 file2 غامضة بين نسخ ملف على آخر ونسخ الملفين إلى الدليل الحالي.)

والنظر في كتابة المجمع الخاصة بك لfind:

#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"

والسطر الثاني يقول "إذا حجة 1 ليست دليل، ثم ضبط وسائط سطر الأوامر لتشمل نقطة متقدما على بقية الأمر سيكون ذلك مربكا إذا قمت بكتابة أي وقت مضى:.

~/bin/find /non-existent/directory -name '*.plist' -print

ولأن الدليل غير موجود ليس دليلا وسوف النصي إضافة نقطة إلى سطر الأوامر - هذا النوع من السبب أنني توقفت عن استخدام القيادة cp الخاص بي

نصائح أخرى

تثبيت GNU تجد بدلا من ذلك.

$ brew install findutils
$ alias find=gfind

وياي، وأنها تعمل!

وإذا كان يجب أن يطلق عليه "العثور على '، ثم تريد:

alias find=/usr/bin/find\ .

وفي .profile أو .bash_profile أو .... استبدل المسار الحقيقي (إن لم يكن / البيرة / بن / العثور) على جهاز ماك OSX. أدخل المسار الكامل لتجنب دورات (باش عادة من شأنه أن يفسر alias find=find دون مشاكل، ولكن أن يكون أفضل متأكدا).

ولكن كنت أفضل عدم تسمية find الاسم المستعار (findl، myfind الخ)، لأنها سوف تصبح عادة والمتاعب بالنسبة لك إذا كنت تحاول ذلك على نظام آخر.

find ./ -name "*.plist"

تعديل : لهم، ربما أكون قد يساء فهمها السؤال! لو كنت مجنونة، وكيف حول محاكاة ذلك عن طريق شيل؟ وأظل بشكل روتيني النصوص فائدة عشوائية في ~ /. بن، وهذا هو أول شيء في بلدي PATH. إذا كان لديك الإعداد مماثل وربما يمكنك أن تفعل شيئا مثل: (! غير مجربة)

#!/bin/sh
# remapping find!
CMD=`echo $1 | cut -c 1`
if [ $CMD = '-' ]
then
# pwd search
  /usr/bin/find ./ $*
else
# regular find
  /usr/bin/find $*
fi

وأود أن أقترح أنه إذا كنت تكتب النصوص (التي هي أكثر عرضة للترحيل من نظام إلى آخر في وقت ما في المستقبل) التي يجب أن محاولة استخدام النموذج أكثر تحديدا من الأمر، وهذا هو تحديد " ". بدلا من الاعتماد على التقصير. لنفس السبب، وأنا قد توحي حتى كتابة النصوص sh بدلا من الاعتماد على bash التي قد لا تكون مثبتة في كل مكان.

وهذا هو على الارجح وليس ما تريد ولكن ماذا عن: alias find="find ."

وأو اختيار اسم جديد (findl للعثور المحلية؟)

وأنت قد تحتاج إلى تشغيل الأوامر الموجودة في هذا الرابط: <لأ href = "https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line- أدوات في ماك السراج-س / "يختلط =" نوفولو noreferrer "> https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools- في ماك السراج-س /

ومن عفا عليها الزمن قليلا، على سبيل المثال وجدت أنني لم يكن لديك لإضافة العديد من الأوامر لسبيلي على الإطلاق.

وهذا يشمل مشكلتك من خلال وجود النظام الخاص بك استخدام الاكتشاف فائدة غير BSD من حزمة findutils، أثناء تثبيت أيضا أدوات أخرى قد ترغب أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top