أحاول تشغيل أمر find
لجميع ملفات JavaScript ، لكن كيف يمكنني استبعاد دليل محدد؟
إليك رمز find
الذي نستخدمه.
for file in $(find . -name '*.js')
do
Java -jar config/yuicompressor-2.4.2.jar --type js $file -o $file
done
استخدم رمز التبديل Prune ، على سبيل المثال إذا كنت ترغب في استبعاد دليل misc
فقط أضف رمز -path ./misc -Prune -o
إلى أمر find:
find . -path ./misc -Prune -o -name '*.txt' -print
هنا مثال مع أدلة متعددة:
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -Prune -o -print
نستبعد هنا dir1 و dir2 و dir3 ، نظرًا لأنه في find
تعبيرات ، إنه إجراء ، يعمل وفقًا للمعايير -path dir1 -o -path dir2 -o -path dir3
(إذا كان dir1 أو dir2 أو dir3) ، ويضاف مع type -d
. مزيد من الإجراءات هو -o print
، مجرد طباعة.
إذا لم ينجح رمز -Prune
لك ، فسيؤدي ذلك إلى:
find -name "*.js" -not -path "./directory/*"
التحذير: / قراءة تعليق @ دانيال.
أجد ما يلي أسهل في التفكير فيه عن الحلول المقترحة الأخرى:
find build -not \( -path build/external -Prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -Prune \) -not \( -path build/blog -Prune \) -name \*.js
ملاحظة مهمة: يجب أن تتطابق المسارات التي تكتبها بعد -path
تمامًا مع ما يطبعه find
دون الاستبعاد. إذا كانت هذه الجملة تربك ، فتأكد من استخدام المسارات الكاملة خلال الخروج من الأمر كله مثل هذا: find
/full/path/-not \( -path
full/path/exclude/this -/-Prune ...
. انظر الملاحظة [1] إذا كنت ترغب في فهم أفضل.
داخل \(
و \)
هو تعبير سوف يتطابق مع بالضبطbuild/external
(انظر الملاحظة المهمة أعلاه) ، وسيحقق نجاحًا تجنب عبور أي شيء أدناه} _. ثم يتم تجميع هذا كتعبير واحد مع الأقواس المتجاوزة ، وبادئة بـ -not
والتي ستجعل find
يتخطى أي شيء تمت مطابقته بواسطة هذا التعبير.
قد يتساءل المرء عما إذا كانت إضافة -not
لن تجعل جميع الملفات الأخرى مخفية بواسطة -Prune
مرة أخرى ، والإجابة هي لا. طريقة عمل -Prune
هي أن أي شيء ، بمجرد الوصول إليه ، يتم تجاهل الملفات الموجودة أسفل هذا الدليل نهائيًا.
يأتي هذا من حالة الاستخدام الفعلي ، حيث كنت بحاجة إلى الاتصال بـ yui-compressor على بعض الملفات التي تم إنشاؤها بواسطة wintersmith ، لكن اترك الملفات الأخرى التي تحتاج إلى إرسالها كما هي.
ملاحظة [1] : إذا كنت ترغب في استبعاد /tmp/foo/bar
وقمت بالعثور على مثل هذا "find /tmp \(...
" فيجب عليك تحديد -path /tmp/foo/bar
. إذا كنت تعمل من ناحية أخرى ، فوجد مثل هذا cd /tmp; find . \(...
ثم يجب عليك تحديد -path ./foo/bar
.
من الواضح أن هناك بعض الالتباس فيما يتعلق بما يجب أن يكون بناء الجملة المفضل لتخطي الدليل.
GNU الرأي
To ignore a directory and the files under it, use -Prune
المنطق
-Prune
يتوقف find
من التنازلي إلى دليل. فقط تحديد -not -path
سيظل ينحدر إلى الدليل skipped ، لكن -not -path
سيكون خطأ عندما يختبر find
كل ملف.
مشاكل مع -Prune
-Prune
يقوم بما هو المقصود به ، ولكن لا تزال بعض الأشياء التي يجب عليك العناية بها عند استخدامها.
find
يطبع الدليل المقطوع.
-Prune
يعمل فقط مع -print
ولا توجد إجراءات أخرى.
-Prune
يعمل مع أي إجراء باستثناء -delete
. لماذا لا يعمل مع الحذف؟ لكي يعمل -delete
، ابحث عن احتياجات لاجتياز الدليل بترتيب DFS ، لأن -delete
سوف يحذف الأوراق أولاً ، ثم آباء الأوراق ، إلخ ... ولكن من أجل تحديد -Prune
ليكون له معنى ، find
يحتاج إلى الضغط على دليل والتوقف عن تنازلي ، الأمر الذي لا معنى له بوضوح مع -depth
أو -delete
.الأداء
لقد قمت بإعداد اختبار بسيط للإجابات الثلاثة العليا التي تم التصويت عليها بشأن هذا السؤال (تم استبدال -print
بـ -exec bash -c 'echo $0' {} \;
لعرض مثال آخر على الإجراء). النتائج أدناه
----------------------------------------------
# of files/dirs in level one directories
.performance_test/Prune_me 702702
.performance_test/other 2
----------------------------------------------
> find ".performance_test" -path ".performance_test/Prune_me" -Prune -o -exec bash -c 'echo "$0"' {} \;
.performance_test
.performance_test/other
.performance_test/other/foo
[# of files] 3 [Runtime(ns)] 23513814
> find ".performance_test" -not \( -path ".performance_test/Prune_me" -Prune \) -exec bash -c 'echo "$0"' {} \;
.performance_test
.performance_test/other
.performance_test/other/foo
[# of files] 3 [Runtime(ns)] 10670141
> find ".performance_test" -not -path ".performance_test/Prune_me*" -exec bash -c 'echo "$0"' {} \;
.performance_test
.performance_test/other
.performance_test/other/foo
[# of files] 3 [Runtime(ns)] 864843145
خاتمة
كل من بناء جملة f10bit و بناء جملة دانيال سوبرال استغرق 10-25 مللي ثانية للتشغيل في المتوسط. بناء جملة GetFree ، والذي لا يستخدم -Prune
، استغرق 865 مللي ثانية. لذا ، نعم مثال متطرف ، ولكن إذا كنت تهتم بوقت التشغيل وتفعل أي شيء مكثف عن بُعد ، فيجب عليك استخدام -Prune
.
ملاحظة بناء جملة دانيال سوبرال أجرى أفضل بناء على جملتي -Prune
، لكنني أظن بشدة أن هذا ناتج عن بعض التخزين المؤقت لأن تبديل الترتيب الذي تم فيه تشغيل الاثنين أدى إلى النتيجة المعاكسة ، بينما كانت النسخة غير المشغولة أبطأ دائمًا.
اختبار كتابي
#!/bin/bash
dir='.performance_test'
setup() {
mkdir "$dir" || exit 1
mkdir -p "$dir/Prune_me/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/w/x/y/z" \
"$dir/other"
find "$dir/Prune_me" -depth -type d -exec mkdir '{}'/{A..Z} \;
find "$dir/Prune_me" -type d -exec touch '{}'/{1..1000} \;
touch "$dir/other/foo"
}
cleanup() {
rm -rf "$dir"
}
stats() {
for file in "$dir"/*; do
if [[ -d "$file" ]]; then
count=$(find "$file" | wc -l)
printf "%-30s %-10s\n" "$file" "$count"
fi
done
}
name1() {
find "$dir" -path "$dir/Prune_me" -Prune -o -exec bash -c 'echo "$0"' {} \;
}
name2() {
find "$dir" -not \( -path "$dir/Prune_me" -Prune \) -exec bash -c 'echo "$0"' {} \;
}
name3() {
find "$dir" -not -path "$dir/Prune_me*" -exec bash -c 'echo "$0"' {} \;
}
printf "Setting up test files...\n\n"
setup
echo "----------------------------------------------"
echo "# of files/dirs in level one directories"
stats | sort -k 2 -n -r
echo "----------------------------------------------"
printf "\nRunning performance test...\n\n"
echo \> find \""$dir"\" -path \""$dir/Prune_me"\" -Prune -o -exec bash -c \'echo \"\$0\"\' {} \\\;
name1
s=$(date +%s%N)
name1_num=$(name1 | wc -l)
e=$(date +%s%N)
name1_perf=$((e-s))
printf " [# of files] $name1_num [Runtime(ns)] $name1_perf\n\n"
echo \> find \""$dir"\" -not \\\( -path \""$dir/Prune_me"\" -Prune \\\) -exec bash -c \'echo \"\$0\"\' {} \\\;
name2
s=$(date +%s%N)
name2_num=$(name2 | wc -l)
e=$(date +%s%N)
name2_perf=$((e-s))
printf " [# of files] $name2_num [Runtime(ns)] $name2_perf\n\n"
echo \> find \""$dir"\" -not -path \""$dir/Prune_me*"\" -exec bash -c \'echo \"\$0\"\' {} \\\;
name3
s=$(date +%s%N)
name3_num=$(name3 | wc -l)
e=$(date +%s%N)
name3_perf=$((e-s))
printf " [# of files] $name3_num [Runtime(ns)] $name3_perf\n\n"
echo "Cleaning up test files..."
cleanup
سيكون أحد الخيارات هو استبعاد جميع النتائج التي تحتوي على اسم الدليل مع grep. فمثلا:
find . -name '*.js' | grep -v excludeddir
هذا هو الوحيد الذي عمل بالنسبة لي.
find / -name NameOfFile ! -path '*/Directory/*'
البحث عن "NameOfFile" باستثناء "الدليل". التركيز على النجوم *.
انا افضل -not
الترميز ... انها اكثر قابلية للقراءة:
find . -name '*.js' -and -not -path directory
استخدم خيار -Prune. لذلك ، شيء مثل:
find . -type d -name proc -Prune -o -name '*.js'
'-type d -name proc -Prune' ابحث فقط عن الدلائل المسماة proc لاستبعادها.
المشغل "-o" عامل تشغيل "OR".
هذا هو التنسيق الذي استخدمته لاستبعاد بعض المسارات:
$ find ./ -type f -name "pattern" ! -path "excluded path" ! -path "excluded path"
لقد استخدمت هذا للعثور على جميع الملفات غير الموجودة في مسارات ". *":
$ find ./ -type f -name "*" ! -path "./.*" ! -path "./*/.*"
بالتأكيد ، يعمل -Prune
وهو أفضل إجابة لأنه يمنع النزول إلى dir الذي تريد استبعاده. -not -path
الذي لا يزال يبحث عن dir المستبعد ، فهو لا يطبع النتيجة ، والتي يمكن أن تكون مشكلة إذا كان dir المستثنى هو وحدة تخزين الشبكة أو إذا لم تكن الأذونات.
الجزء الصعب هو أن find
خاص جدًا بترتيب الوسيطات ، لذلك إذا لم تحصل عليها بشكل صحيح ، فقد لا تعمل الأمر. ترتيب الحجج بشكل عام على هذا النحو:
find {path} {options} {action}
{path}
: ضع كل الوسيطات المرتبطة بالمسار أولاً ، مثل . -path './dir1' -Prune -o
{options}
: لدي أكبر نجاح عند وضع -name, -iname, etc
كخيار أخير في هذه المجموعة. مثلا -type f -iname '*.js'
{action}
: ستحتاج إلى إضافة -print
عند استخدام -Prune
إليك مثال عملي:
# setup test
mkdir dir1 dir2 dir3
touch dir1/file.txt; touch dir1/file.js
touch dir2/file.txt; touch dir2/file.js
touch dir3/file.txt; touch dir3/file.js
# search for *.js, exclude dir1
find . -path './dir1' -Prune -o -type f -iname '*.js' -print
# search for *.js, exclude dir1 and dir2
find . \( -path './dir1' -o -path './dir2' \) -Prune -o -type f -iname '*.js' -print
يعمل نهج -Path -Prune أيضًا مع أحرف البدل في المسار. فيما يلي بيان العثور الذي سيجد الدلائل لخادم git الذي يخدم مستودعات git المتعددة مع ترك الأدلة الداخلية git:
find . -type d \
-not \( -path */objects -Prune \) \
-not \( -path */branches -Prune \) \
-not \( -path */refs -Prune \) \
-not \( -path */logs -Prune \) \
-not \( -path */.git -Prune \) \
-not \( -path */info -Prune \) \
-not \( -path */hooks -Prune \)
هناك الكثير من الإجابات الجيدة ، لقد استغرق الأمر بعض الوقت لفهم معنى كل عنصر من عناصر الأمر والمنطق الذي يقف وراءه.
find . -path ./misc -Prune -o -name '*.txt' -print
سيبدأ find في العثور على الملفات والدلائل في الدليل الحالي ، ومن ثم find .
.
الخيار -o
يرمز إلى منطقي OR ويفصل بين جزأين من الأمر:
[ -path ./misc -Prune ] OR [ -name '*.txt' -print ]
أي دليل أو ملف يمثل لا دليل متفرقات/لن يجتاز الاختبار الأول -path ./misc
. ولكن سيتم اختبارها ضد التعبير الثاني. إذا كان اسمهم يتوافق مع النموذج *.txt
، فسيتم طباعته ، بسبب الخيار -print
.
عندما يصل find إلى الدليل ./misc ، فإن هذا الدليل يرضي التعبير الأول فقط. لذلك سيتم تطبيق خيار -Prune
عليه. يخبر الأمر العثور على لا استكشاف هذا الدليل. لذلك لن يتم استكشاف أي ملف أو دليل في ./misc بالبحث ، ولن يتم اختباره مقابل الجزء الثاني من التعبير ولن تتم طباعته.
لاستبعاد أدلة متعددة:
find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" \)
لإضافة أدلة ، أضف -o -path "./dirname/*"
:
find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" -o -path "./dir3/*"\)
ولكن ربما يجب عليك استخدام تعبير منتظم ، إذا كان هناك العديد من الدلائل لاستبعادها.
لحل عملي (تم اختباره على Ubuntu 12.04 (Precise Pangolin)) ...
find ! -path "dir1" -iname "*.mp3"
سيبحث عن ملفات MP3 في المجلد الحالي والمجلدات الفرعية باستثناء المجلد الفرعي dir1.
استعمال:
find ! -path "dir1" ! -path "dir2" -iname "*.mp3"
... لاستبعاد dir1 و dir2
يمكنك استخدام خيار Prune لتحقيق ذلك. كما في المثال:
find ./ -path ./beta/* -Prune -o -iname example.com -print
أو خيار grep معكوس "grep -v":
find -iname example.com | grep -v beta
يمكنك العثور على إرشادات وأمثلة مفصلة فييستبعد الأمر Linux find الدلائل من البحث.
find -name '*.js' -not -path './node_modules/*' -not -path './vendor/*'
يبدو أن العمل هو نفسه
find -name '*.js' -not \( -path './node_modules/*' -o -path './vendor/*' \)
وأسهل لتذكر IMO.
لأولئك منكم على الإصدارات القديمة من UNIX الذين لا يستطيعون استخدام -path أو -لا
تم اختباره على SunOS 5.10 bash 3.2 و SunOS 5.11 bash 4.4
find . -type f -name "*" -o -type d -name "*excluded_directory*" -Prune -type f
كنت أستخدم find
لتقديم قائمة بالملفات لـ xgettext
وأردت حذف دليل محدد ومحتوياته. لقد جربت العديد من التباديل لـ -path
مقترنة بـ -Prune
لكن لم أستطع استبعاد الدليل الذي أردت أن أذهب إليه بالكامل.
على الرغم من أنني كنت قادرًا على تجاهل محتويات للدليل الذي أردت تجاهله ، إلا أن find
أعاد الدليل نفسه كأحد النتائج ، مما تسبب في تعطل xgettext
كنتيجة (لا يقبل الدلائل ؛ الملفات فقط) .
كان حلي هو ببساطة استخدام grep -v
لتخطي الدليل الذي لم أكن أريده في النتائج:
find /project/directory -iname '*.php' -or -iname '*.phtml' | grep -iv '/some/directory' | xargs xgettext
سواء كانت هناك حجة لـ find
ستعمل بنسبة 100٪ أم لا ، لا يمكنني القول على وجه اليقين. استخدام grep
كان حلاً سريعًا وسهلاً بعد بعض الصداع.
بالنسبة إلى ما احتاجته ، كان يعمل على هذا النحو ، ابحث عن landscape.jpg
في جميع الخوادم بدءًا من الجذر واستبعد البحث في دليل /var
:
find / -maxdepth 1 -type d | grep -v /var | xargs -I '{}' find '{}' -name landscape.jpg
find / -maxdepth 1 -type d
يسرد جميع d الأدلة في /
grep -v /var
يستبعد `/ var 'من القائمة
xargs -I '{}' find '{}' -name landscape.jpg
تنفيذ أي أمر ، مثل find
مع كل دليل/نتيجة من القائمة
هذا مناسب لي على جهاز Mac:
find . -name *.php -or -path "./vendor" -Prune -or -path "./app/cache" -Prune
ستستبعد vendor
و app/cache
dir لاسم البحث الذي تلحق بـ php
.
find . -name '*.js' -\! -name 'glob-for-excluded-dir' -Prune
أي من الإجابات السابقة جيدة على أوبونتو. جرب هذا:
find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"
لقد وجدت هذا هنا
طريقة الاستخدام - خيار - - - - - - - - - - - - - - - - - - - - - - - - - in-sh إجابة ممتازة بواسطة Laurence Gonsalves حول كيفية عمل -Prune
.
وهنا الحل العام:
find /path/to/search \
-type d \
\( -path /path/to/search/exclude_me \
-o \
-name exclude_me_too_anywhere \
\) \
-Prune \
-o \
-type f -name '*\.js' -print
لتجنب كتابة /path/to/seach/
عدة مرات ، قم بلف find
في زوج pushd .. popd
.
pushd /path/to/search; \
find . \
-type d \
\( -path ./exclude_me \
-o \
-name exclude_me_too_anywhere \
\) \
-Prune \
-o \
-type f -name '*\.js' -print; \
popd
استخدم الإجراء exec
بشكل أفضل من حلقة for
:
find . -path "./dirtoexclude" -Prune \
-o -exec Java -jar config/yuicompressor-2.4.2.jar --type js '{}' -o '{}' \;
سيتم تنفيذ exec ... '{}' ... '{}' \;
مرة واحدة لكل ملف مطابق ، مع استبدال الأقواس '{}'
باسم الملف الحالي.
لاحظ أن الأقواس مرفقة بعلامات اقتباس مفردة لحمايتها من التفسير كعلامة ترقيم برامج شل*.
* من قسم الأمثلة في صفحة find (GNU findutils) 4.4.2
man
جربت الأمر أعلاه ، ولكن لا يعمل أي من يستخدمون "-Prune" من أجلي في النهاية ، جربت الأمر باستخدام الأمر أدناه:
find . \( -name "*" \) -Prune -a ! -name "directory"
لقد وجدت اسم الوظائف في ملفات مصادر C تستثني * .o وتستبعد * .swp وتستبعد (ليس ملفًا عاديًا) وتستبعد إخراج dir بهذا الأمر:
find . \( ! -path "./output/*" \) -a \( -type f \) -a \( ! -name '*.o' \) -a \( ! -name '*.swp' \) | xargs grep -n soc_attach
هناك الكثير من الإجابات هنا بالفعل ؛ أنا أحجم عن إضافة أخرى ، لكنني أعتقد أن هذه المعلومات مفيدة.
TLDR: فهم الدلائل الجذرية الخاصة بك وقم بتخصيص البحث من هناك ، باستخدام خيار "-Prune
".
الخلفية: لدي موقع نسخ احتياطي rsnapshot
(rsync
) ، /mnt/Backups/
، الذي يسبب الصداع عند البحث عن ملفات النظام (/
) ، حيث تشتمل النسخ الاحتياطية على حوالي 4.5 تيرابايت (terra) من الملفات!
لدي أيضًا /mnt/Vancouver
، مجلد العمل الرئيسي الذي يحتوي على TB من الملفات ، والذي تم نسخه احتياطيًا [/mnt/Backups/
و /mnt/Vancouver/
] مثبت فعليًا (متكرر) على محركات أقراص منفصلة].
من أفضل جوابين هنا ( كيفية استبعاد دليل في find. command ) ، أجد أن البحث في ملفات النظام باستخدام الإجابة المقبولة هو كثير / أسرع ، مع المحاذير.
هذا
find / -path /mnt -Prune -o -name "*libname-server-2.a*" -print
يجد هذا الملف في ~ 3-4 ثواني ؛ هذا
find / -name "*libname-server-2.a*" -not -path "/mnt/*"
يبدو (؟) للتكرار من خلال كافة الدلائل المستبعدة (لقطات rsync
المتداخلة بعمق من جميع وحدات التخزين المحملة) ، لذلك يأخذ إلى الأبد . أفترض أنها تبحث في ملفات متعددة السل ، لذلك تعثرت بشكل غير متوقع. على سبيل المثال ، إذا حاولت "وقت" البحث (time find ...
) ، أرى مخرجات وفيرة - مما يشير إلى أن find
يتخطى بعمق الدليل "المستبعد":
...
find: ‘/mnt/Backups/rsnapshot_backups/monthly.0/snapshot_root/var/lib/udisks2’: Permission denied
...
يؤدي إلحاق شرطة مائلة للأمام بعد الدليل المستبعد (/mnt/
) أو مسار متداخل (`/ mnt/Backups ') إلى هذا البحث مرة أخرى * أخذ إلى الأبد:
بطيئة:
find / -path /mnt/ -Prune -o -name "*libname-server-2.a*" -print
find / -path /mnt/Vancouver -Prune -o -name "*libname-server-2.a*" -print
"SOLUTION"
إليك أفضل الحلول (كل هذه تنفذ في ثوانٍ). مرة أخرى ، هيكل الدليل الخاص بي هو
/
: الجذر/mnt/Backups/
: نسخ احتياطية متعددة السل/mnt/Vancouver/
: دليل عمل متعدد السل (تم نسخه احتياطيًا لـ /mnt/Backups
على محرك أقراص منفصل) ، والذي غالبًا ما أرغب في البحث عنه/home/*
: نقاط التحميل الأخرى/"محركات الأقراص" العاملة (على سبيل المثال ، /home/victoria
= ~
) ملفات النظام (/
):
للعثور على ملف نظام بسرعة ، استبعد /mnt
( لا /mnt/
أو /mnt/Backups
، ...):
$ find / -path /mnt -Prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a
الذي يجد هذا الملف في ~ 3-4 ثواني.
الملفات بخلاف النظام:
مثلا لتحديد موقع ملف بسرعة في أحد "محركات الأقراص" العاملة و /mnt/Vancouver/
و/أو /home/victoria/
).
$ find /mnt/Vancouver/ -name "*04t8ugijrlkj.jpg"
/mnt/Vancouver/temp/04t8ugijrlkj.jpg
$ find /home/victoria -iname "*Untitled Document 1"
/home/victoria/backups/shortcuts.bak.2016.11.02/Untitled Document 1
/home/victoria/Untitled Document 1
النسخ الاحتياطية:
مثلا للعثور على ملف محذوف ، في أحد النسخ الاحتياطية لكل ساعة/يومي/أسبوعي/شهري).
$ find /mnt/Backups/rsnapshot_backups/daily.0 -name "*04t8ugijrlkj.jpg"
/mnt/Backups/rsnapshot_backups/daily.0/snapshot_root/mnt/Vancouver/temp/04t8ugijrlkj.jpg
جانبا: إضافة -print في نهاية الأمر يمنع النسخة المطبوعة من الدليل المستبعد:
$ find / -path /mnt -Prune -o -name "*libname-server-2.a*"
/mnt
/usr/lib/libname-server-2.a
$ find / -path /mnt -Prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a
$
لست متأكدًا مما إذا كان هذا سيغطي جميع حالات Edge ، ولكن التالي سيكون مستقيمًا إلى الأمام وبسيطًا:
ls -1|grep -v -e ddl -e docs| xargs rm -rf
سيؤدي هذا إلى إزالة جميع الملفات/الدلائل من الدليل الحالي ، باستثناء "ddls" و "docs".
إذا كانت أدلة البحث تحتوي على نمط (في حالتي في معظم الأحيان) ؛ يمكنك ببساطة القيام بذلك مثل أدناه:
find ./n* -name "*.tcl"
في المثال أعلاه ؛ يبحث في جميع الدلائل الفرعية التي تبدأ بـ "n".
من أجل FreeBSD المستخدمين:
find . -name '*.js' -not -path '*exclude/this/dir*'
هذا يعمل لأن find
الاختباراتالملفات الخاصة بالنمط -" * foo * ":
find ! -path "dir1" ! -path "dir2" -name "*foo*"
ولكنه يعمللايعمل إذا كنت لا تستخدم نمط (find
لااختبارالملف). لذلك لا يستخدم find
تقييمه السابق " true " & " false " منطقية. مثال لعدم استخدام حالة الاستخدام مع التدوين أعلاه:
find ! -path "dir1" ! -path "dir2" -type f
لا يوجد اختبار find
! لذلك إذا كنت بحاجة إلى العثور على الملفات دون أي مطابقة للنمط ، استخدم -Prune. أيضًا ، من خلال استخدام Prune find
، يكون دائمًا أسرع في حين أنه يتخطى بالفعل تلك الأدلة بدلاً من مطابقتها أو من الأفضل عدم مطابقتها. لذلك في هذه الحالة استخدم شيئًا مثل:
find dir -not \( -path "dir1" -Prune \) -not \( -path "dir2" -Prune \) -type f
أو:
find dir -not \( -path "dir1" -o -path "dir2" -Prune \) -type f
مع تحياتي
لقد وجدت الاقتراحات في هذه الصفحة والكثير من الصفحات الأخرى لا تعمل على نظام Mac OS X الخاص بي. ومع ذلك ، لقد وجدت الاختلاف الذي يعمل بالنسبة لي.
تتمثل الفكرة الكبيرة في البحث في Macintosh HD ولكن تجنب اجتياز جميع وحدات التخزين الخارجية ، والتي هي في معظمها نسخ احتياطية لآلة Time Time ونسخ احتياطي للصور ومشاركات محمولة وأرشيف ، ولكن دون الاضطرار إلى إلغاء تحميلها جميعًا ، وهو أمر غير عملي في أغلب الأحيان.
إليكم نص العمل الذي قمت بتسميته "findit".
#!/usr/bin/env bash
# inspired by http://stackoverflow.com/questions/4210042/exclude-directory-from-find-command Danile C. Sobral
# using special syntax to avoid traversing.
# However, logic is refactored because the Sobral version still traverses
# everything on my system
echo ============================
echo find - from cwd, omitting external volumes
date
echo Enter Sudo password if requested
Sudo find . -not \( \
-path ./Volumes/Archive -Prune -o \
-path ./Volumes/Boot\ OS\ X -Prune -o \
-path ./Volumes/C \
-path ./Volumes/Data -Prune -o \
-path ./Volumes/jas -Prune -o \
-path ./Volumes/Recovery\ HD -Prune -o \
-path ./Volumes/Time\ Machine\ Backups -Prune -o \
-path ./Volumes/SuperDuper\ Image -Prune -o \
-path ./Volumes/userland -Prune \
\) -name "$1" -print
date
echo ============================
iMac2:~ jas$
ترتبط المسارات المختلفة بأحجام الأرشيف الخارجي ، و Time Machine ، والأجهزة الظاهرية ، والخوادم المحمّلة الأخرى ، وما إلى ذلك. تحتوي بعض أسماء وحدات التخزين على مسافات بها.
التشغيل الجيد للاختبار هو "findit index.php" ، لأن هذا الملف يحدث في العديد من الأماكن على نظامي. باستخدام هذا البرنامج النصي ، يستغرق البحث في محرك الأقراص الرئيسي الرئيسي حوالي 10 دقائق. بدون هذه الاستبعادات ، يستغرق الأمر ساعات طويلة.