it-swarm.asia

كيفية استبعاد دليل في الاكتشاف. أمر

أحاول تشغيل أمر find لجميع ملفات JavaScript ، لكن كيف يمكنني استبعاد دليل محدد؟

إليك رمز find الذي نستخدمه.

for file in $(find . -name '*.js')
do 
  Java -jar config/yuicompressor-2.4.2.jar --type js $file -o $file
done
1108
helion3

استخدم رمز التبديل 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 ، مجرد طباعة.

853
f10bit

إذا لم ينجح رمز -Prune لك ، فسيؤدي ذلك إلى:

find -name "*.js" -not -path "./directory/*"

التحذير: / قراءة تعليق @ دانيال.

1727
GetFree

أجد ما يلي أسهل في التفكير فيه عن الحلول المقترحة الأخرى:

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 \( -pathfull/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.

408
Daniel C. Sobral

من الواضح أن هناك بعض الالتباس فيما يتعلق بما يجب أن يكون بناء الجملة المفضل لتخطي الدليل.

GNU الرأي

To ignore a directory and the files under it, use -Prune

من GNU ابحث عن صفحة رجل)

المنطق

-Prune يتوقف find من التنازلي إلى دليل. فقط تحديد -not -path سيظل ينحدر إلى الدليل skipped ، لكن -not -path سيكون خطأ عندما يختبر find كل ملف.

مشاكل مع -Prune

-Prune يقوم بما هو المقصود به ، ولكن لا تزال بعض الأشياء التي يجب عليك العناية بها عند استخدامها.

  1. find يطبع الدليل المقطوع.

    • TRUEهذا هو السلوك المقصود ، إنه لا ينزل إليه. لتجنب طباعة الدليل كليًا ، استخدم بناء جملة يحذفه بشكل منطقي.
  2. -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
183
BroSlow

سيكون أحد الخيارات هو استبعاد جميع النتائج التي تحتوي على اسم الدليل مع grep. فمثلا:

find . -name '*.js' | grep -v excludeddir
55
Joshua

هذا هو الوحيد الذي عمل بالنسبة لي.

find / -name NameOfFile ! -path '*/Directory/*'

البحث عن "NameOfFile" باستثناء "الدليل". التركيز على النجوم *.

42
DimiDak

انا افضل -not الترميز ... انها اكثر قابلية للقراءة:

find . -name '*.js' -and -not -path directory
39
mpapis

استخدم خيار -Prune. لذلك ، شيء مثل:

find . -type d -name proc -Prune -o -name '*.js'

'-type d -name proc -Prune' ابحث فقط عن الدلائل المسماة proc لاستبعادها.
المشغل "-o" عامل تشغيل "OR".

18
Drew Frezell

هذا هو التنسيق الذي استخدمته لاستبعاد بعض المسارات:

$ find ./ -type f -name "pattern" ! -path "excluded path" ! -path "excluded path"

لقد استخدمت هذا للعثور على جميع الملفات غير الموجودة في مسارات ". *":

$ find ./ -type f -name "*" ! -path "./.*" ! -path "./*/.*"
14
user1882879

بالتأكيد ، يعمل -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
13
wisbucky

يعمل نهج -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 \)  
9
Wolfgang Fahl

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

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 بالبحث ، ولن يتم اختباره مقابل الجزء الثاني من التعبير ولن تتم طباعته.

8
Istopopoki

لاستبعاد أدلة متعددة:

find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" \)

لإضافة أدلة ، أضف -o -path "./dirname/*":

find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" -o -path "./dir3/*"\)

ولكن ربما يجب عليك استخدام تعبير منتظم ، إذا كان هناك العديد من الدلائل لاستبعادها.

8
JBENOIT

لحل عملي (تم اختباره على Ubuntu 12.04 (Precise Pangolin)) ...

find ! -path "dir1" -iname "*.mp3"

سيبحث عن ملفات MP3 في المجلد الحالي والمجلدات الفرعية باستثناء المجلد الفرعي dir1.

استعمال:

find ! -path "dir1" ! -path "dir2" -iname "*.mp3"

... لاستبعاد dir1 و dir2

7
james dupin

يمكنك استخدام خيار Prune لتحقيق ذلك. كما في المثال:

find ./ -path ./beta/* -Prune -o -iname example.com -print

أو خيار grep معكوس "grep -v":

find -iname example.com | grep -v beta

يمكنك العثور على إرشادات وأمثلة مفصلة فييستبعد الأمر Linux find الدلائل من البحث.

6
Siju V
find -name '*.js' -not -path './node_modules/*' -not -path './vendor/*'

يبدو أن العمل هو نفسه

find -name '*.js' -not \( -path './node_modules/*' -o -path './vendor/*' \)

وأسهل لتذكر IMO.

4
Funkodebat

لأولئك منكم على الإصدارات القديمة من 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
3
JaredTS486

كنت أستخدم 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 كان حلاً سريعًا وسهلاً بعد بعض الصداع.

3
Lemmings19

بالنسبة إلى ما احتاجته ، كان يعمل على هذا النحو ، ابحث عن 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 مع كل دليل/نتيجة من القائمة

2
adrianTNT

هذا مناسب لي على جهاز Mac:

find . -name *.php -or -path "./vendor" -Prune -or -path "./app/cache" -Prune

ستستبعد vendor و app/cache dir لاسم البحث الذي تلحق بـ php.

2
jiahut
find . -name '*.js' -\! -name 'glob-for-excluded-dir' -Prune
2
The Archetypal Paul

أي من الإجابات السابقة جيدة على أوبونتو. جرب هذا:

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

لقد وجدت هذا هنا

2
sixro

طريقة الاستخدام - خيار - - - - - - - - - - - - - - - - - - - - - - - - - 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
1
go2null

استخدم الإجراء 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

1
Alberto

جربت الأمر أعلاه ، ولكن لا يعمل أي من يستخدمون "-Prune" من أجلي في النهاية ، جربت الأمر باستخدام الأمر أدناه:

find . \( -name "*" \) -Prune -a ! -name "directory"
1
Jolly Liu

لقد وجدت اسم الوظائف في ملفات مصادر C تستثني * .o وتستبعد * .swp وتستبعد (ليس ملفًا عاديًا) وتستبعد إخراج dir بهذا الأمر:

find .  \( ! -path "./output/*" \) -a \( -type f \) -a \( ! -name '*.o' \) -a \( ! -name '*.swp' \) | xargs grep -n soc_attach
1
Ivan Ivanovich

هناك الكثير من الإجابات هنا بالفعل ؛ أنا أحجم عن إضافة أخرى ، لكنني أعتقد أن هذه المعلومات مفيدة.

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
$ 
1
Victoria Stuart

لست متأكدًا مما إذا كان هذا سيغطي جميع حالات Edge ، ولكن التالي سيكون مستقيمًا إلى الأمام وبسيطًا:

ls -1|grep -v -e ddl -e docs| xargs rm -rf

سيؤدي هذا إلى إزالة جميع الملفات/الدلائل من الدليل الحالي ، باستثناء "ddls" و "docs".

0
Arnab

إذا كانت أدلة البحث تحتوي على نمط (في حالتي في معظم الأحيان) ؛ يمكنك ببساطة القيام بذلك مثل أدناه:

find ./n* -name "*.tcl" 

في المثال أعلاه ؛ يبحث في جميع الدلائل الفرعية التي تبدأ بـ "n".

0
Prince Bhanwra

من أجل FreeBSD المستخدمين:

 find . -name '*.js' -not -path '*exclude/this/dir*'
0
Richard Bartisek

هذا يعمل لأن 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

مع تحياتي

0
d0n

لقد وجدت الاقتراحات في هذه الصفحة والكثير من الصفحات الأخرى لا تعمل على نظام 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 دقائق. بدون هذه الاستبعادات ، يستغرق الأمر ساعات طويلة.

0
Jeffrey Simon