සොයාගැනීමේදී නාමාවලිය බැහැර කරන්නේ කෙසේද. විධානය


1413

මම findසියලු ජාවාස්ක්‍රිප්ට් ලිපිගොනු සඳහා විධානයක් ක්‍රියාත්මක කිරීමට උත්සාහ කරමි , නමුත් විශේෂිත නාමාවලියක් බැහැර කරන්නේ කෙසේද?

මෙන්න findඅපි භාවිතා කරන කේතය.

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

10
ඔබ බැහැර කළ යුතු නාමාවලිය කුමක්ද?
පුරාවිද්‍යා පෝල්

11
භාවිතා කිරීම වඩා හොඳය find ... | while read -r file .... එසේම, පිළිතුරු පිළිගැනීම සහ ඉහළ නැංවීම වඩා හොඳය.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

කියවීම මන්දගාමී වන අතර, ඇතුළත වේගවත් වේ
mpapis

18
@mpapis නිවැරදිව කියවන විට සුදු පැහැති අවකාශය සමඟ සම්පූර්ණ රේඛා හසුරුවයි.
ජීන්-පිලිප් පෙලට්

1
ලිපිගොනු ඒවායේ නම් වලින් ඇති ෆෝල්ඩරයක මෙය ක්‍රියාත්මක කරන්න : for file in $(find .); do echo "$file"; done. අපට අවශ්‍ය නැති අවකාශයන් සහිත නම් බෙදී ඇත.
ජීන්-පිලිප් පෙලට්

Answers:


1176

-pruneස්විචය භාවිතා කරන්න . උදාහරණයක් ලෙස, ඔබට miscනාමාවලිය බැහැර කිරීමට අවශ්‍ය නම් -path ./misc -prune -oඔබේ සොයා ගැනීමේ විධානයට a එක් කරන්න:

find . -path ./misc -prune -o -false -name '*.txt'

බහුවිධ නාමාවලි සහිත උදාහරණයක් මෙන්න:

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -false -o -name '*.txt'

මෙහිදී අපි වත්මන් නාමාවලියෙහි ./dir1 , ./dir2 සහ ./dir3 බැහැර කරමු , මන්ද findප්‍රකාශනවල එය නිර්ණායක මත ක්‍රියා කරන ක්‍රියාවක් වන බැවින් -path dir1 -o -path dir2 -o -path dir3( dir1 හෝ dir2 හෝ dir3 නම් ), ANDed සමඟ type -d.

ඕනෑම මට්ටමකින් නාමාවලි නාමය බැහැර කිරීමට, භාවිතා කරන්න -name:

find . -type d \( -name node_modules -o -name dir2 -o -path name \) -prune -false -o -name '*.json'

93
හ්ම්. ප්‍රතිදානය තුළ නොසලකා හරින ලද "./misc" නාමාවලිය එයට ඇතුළත් වන බැවින් මෙය මට වැඩ නොකරයි.
තියුනි

86
@Theuni ඔබ පැහැදිලිවම -print(හෝ වෙනත් ක්‍රියාවක්) එකතු නොකළ නිසා එය ඔබ වෙනුවෙන් වැඩ නොකරනු -nameඇත. එවැනි අවස්ථාවක, -oමුද්‍රණය අවසන් වන “පැති” දෙකම , ඔබ භාවිතා කරන්නේ නම් -print, එම පැත්ත පමණක් මුද්‍රණය වේ.
ඩැනියෙල් සී. සොබ්රාල්

4
මෑන්පේජ් වෙතින්: Because -delete implies -depth, you cannot usefully use -prune and -delete together.ඉතින්, මකාදැමීමෙන් නිශ්චිත නාමාවලි බැහැර කිරීමට අවශ්‍ය නම් සොයා ගැනීම සමඟ මකා දැමිය යුත්තේ කෙසේද?
ජැනිස් එල්මරිස්

15
ප්‍රති direct ල වලින් සම්පූර්ණ නාමාවලියම ඉවත් කිරීමට භාවිතා කරන්න : find . -not -path "./.git*". ./dir*ඒ වෙනුවට භාවිතා කිරීම ./dir/*නාමාවලිය මෙන්ම ප්‍රතිදානයෙන් අන්තර්ගතය ඉවත් කරයි.
micahblu

72
මෙම ප්‍රශ්නය සහ පිළිතුරු වල ඇති ව්‍යාකූලත්වය, සොයාගත් පරිශීලක අතුරුමුහුණත මිනිසුන්ට අවශ්‍ය දේ සමඟ කෙතරම් නරක ලෙස ගැලපේද යන්න පිළිබඳ ප්‍රකාශයකි.
ජොහැන්නස් ඕවර්මන්

1961

ඔබ -pruneවෙනුවෙන් වැඩ නොකරන්නේ නම් , මෙය:

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

Caveat: සියලු අනවශ්‍ය නාමාවලි හරහා ගමන් කිරීම අවශ්‍ය වේ.


87
පිළිගත් පිළිතුරේ එක් අදහස් දැක්වීමක් ගැටළුව පෙන්වා දෙයි. -pruneනාමාවලියම බැහැර නොකරයි, එය එහි අන්තර්ගතය බැහැර කරයි, එයින් අදහස් කරන්නේ ඔබ බැහැර කළ නාමාවලිය සමඟ ප්‍රතිදානයේ අනවශ්‍ය රේඛාවක් ලබා ගැනීමට යන බවයි.
GetFree

101
නියම පිළිතුර. මම මේ එක් කරන්න, ඔබ විසින් පළමු වෙනස් කිරීම මගින් ඕනෑම මට්ටමින් නාමාවලියක් ඉවත් හැකි බව කැමතියි .කිරීමට *. එබැවින් find -name "*.js" -not -path "*/omitme/*"ඕනෑම ගැඹුරකදී “omitme” නම් නාමාවලියෙන් ගොනු මඟ හැරෙනු ඇත.
ඩී ඩී

84
එය තවමත් අනවශ්‍ය නාමාවලිය හරහා ගමන් කරයි . මම මගේම පිළිතුරක් එක් කරමි. :-)
ඩැනියෙල් සී. සොබ්රාල්

18
කෙසේ වෙතත්, කප්පාදු විකල්පය ක්‍රියා නොකරන්නේ ඔබ -printපැහැදිලිව භාවිතා නොකරන්නේ නම් පමණක් බව සලකන්න .
ඩැනියෙල් සී. සොබ්රාල්

39
"මෙය -prune භාවිතා කිරීම සඳහා විකල්පයක්" යැයි පැවසීම වඩා හොඳය. -ප්‍රූන් යෝජනා කරන පිළිතුරු පැහැදිලිවම වැරදියි, ඒවා ඔබ කරන ආකාරයට නොවේ.
ජිම්බෝ

464

වෙනත් යෝජිත විසඳුම් වලට වඩා පහත සඳහන් කරුණු තර්ක කිරීම පහසු යැයි මට පෙනේ:

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. මෙම වාක්‍යය ව්‍යාකූල වුවහොත් මේ ආකාරයට සම්පූර්ණ විධානය හරහා සම්පූර්ණ මාර්ග භාවිතා කිරීමට වග බලා ගන්න : . ඔබට වඩා හොඳ අවබෝධයක් අවශ්‍ය නම් සටහන [1] බලන්න.find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...

ඇතුළත \(සහ \)එය හරියටම ගැලපෙන ප්‍රකාශනයකි build/external(ඉහත වැදගත් සටහන බලන්න), සහ සාර්ථක වූ විට, පහත කිසිවක් ගමන් කිරීමෙන් වළකින්න . මෙය පසුව පැන ගිය වරහන් සමඟ තනි ප්‍රකාශනයක් ලෙස කාණ්ඩගත කර ඇති අතර, එම ප්‍රකාශනයට අනුරූප වන ඕනෑම දෙයක් මඟ හැරීමට පෙර උපසර්ගයක් -notඇත find.

එක් කිරීමෙන් -notඅනෙක් සියලුම ලිපිගොනු -pruneනැවත දර්ශනය වීමෙන් සැඟවිය නොහැකිදැයි කෙනෙකුට ඇසිය හැකිය , පිළිතුර නැත. -pruneක්‍රියා කරන ආකාරය නම්, එය ලඟා වූ පසු, එම නාමාවලියට පහළින් ඇති ගොනු ස්ථිරවම නොසලකා හරිනු ලැබේ.

මෙය සත්‍ය භාවිත නඩුවකින් පැමිණේ, එහිදී මට ශීත m තු විසින් ජනනය කරන ලද සමහර ලිපිගොනු සඳහා යූ-කොම්ප්‍රෙෂර් ඇමතීමට අවශ්‍ය විය, නමුත් එවිය යුතු වෙනත් ලිපිගොනු අතහැර දමන්න.


සටහන [1] : ඔබට බැහැර කිරීමට අවශ්‍ය නම් /tmp/foo/barසහ ඔබ මේ ආකාරයට සොයාගතහොත් " find /tmp \(..." ඔබ සඳහන් කළ යුතුය -path /tmp/foo/bar. අනෙක් අතට ඔබ දුවන්නේ මේ ආකාරයට cd /tmp; find . \(...නම් ඔබ සඳහන් කළ යුතුය -path ./foo/bar.


37
විශිෂ්ට පිළිතුර, ස්තූතියි. මෙය ක්‍රියාත්මක වන අතර බහු බැහැර කිරීම් සඳහා පරිමාණය කළ හැකි (කියවිය හැකි) වේ. ඔබ මහත්වරුනි, විශාරදයෙකි සර්. බහුවිධ බැහැර කිරීම් සඳහා උදාහරණයට ස්තූතියි
Freedom_Ben

7
මට -delete ස්විචය භාවිතා කිරීමට අවශ්‍ය නම් මෙය ක්‍රියා නොකරයි:find . -not \( -path ./CVS -prune \) -type f -mtime +100 -delete find: The -delete action atomatically turns on -depth, but -prune does nothing when -depth is in effect. If you want to carry on anyway, just explicitly use the -depth option.
Jānis Elmeris

17
An ජැනිස් ඔබට -exec rm -rf {} \;ඒ වෙනුවට භාවිතා කළ හැකිය -delete.
ඩැනියෙල් සී. සොබ්රාල්

11
හි ප්‍රතිදානය විමසා බැලීමෙන් find, මෙය සැබවින්ම පැහැදිලිය, නමුත් එය මාව ඉහළට ඔසවා තැබීය. ඔබ වත්මන් නාමාවලියෙහි සොයන්නේ නම් ( .සෙවුම් මාර්ගය ලෙස සඳහන් කිරීමෙන් හෝ එකක්වත් සඳහන් නොකිරීමෙන්), -pathආරම්භ වීමට පසු ඔබේ රටාව ඔබට අවශ්‍ය වනු ඇත ./, උදා : find -not \( -path ./.git -prune \) -type f.
සැන්ටියර්

8
මෙම ක්‍රමයේ වඩාත් නිවැරදි (සහ පොසික්ස් අනුකූල) විචලනය: find searchdir \! \( -type d \( -path './excludedir/*' -o -path './excludedir2/*' -o -path './excludedir3/*' \) -prune \)ඉන්පසු ඔබ සොයන දේට ගැලපෙන ඕනෑම කොන්දේසි.
වෝල්ෆ්

220

නාමාවලිය මඟ හැරීම සඳහා වඩාත් කැමති වාක්‍ය ඛණ්ඩය කුමක් විය යුතුද යන්න පිළිබඳව මෙහි යම් ව්‍යාකූලතාවයක් ඇත.

GNU මතය

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

GNU වෙතින් man පිටුව සොයා ගන්න

තර්කනය

-prunefindනාමාවලියකට බැසීම නතර කරයි. නියම කිරීම -not -pathතවමත් මඟ හැරුණු නාමාවලියට බැස යනු ඇත , නමුත් සෑම ගොනුවක්ම පරීක්ෂා කරන සෑම -not -pathවිටම එය අසත්‍ය findවේ.

සමඟ ගැටළු -prune

-prune එය අදහස් කරන දේ කරයි, නමුත් එය භාවිතා කිරීමේදී ඔබ සැලකිලිමත් විය යුතු සමහර දේවල් තවමත් පවතී.

  1. find කප්පාදු කළ නාමාවලිය මුද්‍රණය කරයි.

    • සත්‍යය එය අපේක්ෂිත හැසිරීමයි, එය එයට බැස නොයයි. නාමාවලිය මුලුමනින්ම මුද්‍රණය නොකිරීමට, තර්කානුකූලව මඟ හැරුණු සින්ටැක්ස් භාවිතා කරන්න.
  2. -pruneපමණක් ක්‍රියා කරන -printඅතර වෙනත් ක්‍රියා නොමැත.

    • සත්‍ය නොවේ . -pruneහැර වෙනත් ඕනෑම ක්‍රියාවක් සමඟ ක්‍රියා කරයි -delete. මකාදැමීම සමඟ එය ක්‍රියා නොකරන්නේ ඇයි? සඳහා -deleteවැඩ කිරීමට, සිට, DFS පිණිස බහලුම තරණය කිරීමට අවශ්යතා සොයා -deleteපළමු, කොළ, දෙමාපියන්, පසුව කොළ මකා ආදිය ඇත ... නමුත් නියම සඳහා -pruneතේරුමක් කිරීමට, findඑය බැස නාමාවලියක් හා නැවතුම් පහර කිරීමට අවශ්ය, වන පැහැදිලිවම -depthහෝ සමඟ කිසිදු තේරුමක් නැත -delete.

කාර්ය සාධනය

මෙම ප්‍රශ්නයට ඉහළින් ඉහළට ඔසවා ඇති පිළිතුරු තුන පිළිබඳ සරල පරීක්ෂණයක් මම සකස් කළෙමි ( වෙනත් ක්‍රියාකාරී උදාහරණයක් පෙන්වීමට ආදේශ -printකර -exec bash -c 'echo $0' {} \;ඇත). ප්‍රති Results ල පහතින්

----------------------------------------------
# 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 ගේ කාරක රීති හා දානියෙල් සී Sobral ගේ කාරක රීති සාමාන්යයෙන් ක්රියාත්මක කිරීමට 10-25ms විය. GetFree හි සින්ටැක්ස් , භාවිතා නොකරන -prune, මීටර් 865 ක් ගතවිය. ඉතින්, ඔව් මෙය තරමක් ආන්තික උදාහරණයකි, නමුත් ඔබ ධාවන කාලය ගැන සැලකිලිමත් වන අතර දුරස්ථව දැඩි ලෙස යමක් කරන්නේ නම් ඔබ භාවිතා කළ යුතුය -prune.

සටහන ඩැනියෙල් සී. සොබ්රාල්ගේ වාක්‍ය ඛණ්ඩය වාක්‍ය දෙකෙන් වඩා හොඳ -pruneප්‍රති performed ල ලබා දුන්නේය . නමුත්, මම තදින්ම සැක කරන්නේ මෙය යම් හැඹිලියක ප්‍රති the ලය ප්‍රතිවිරුද්ධ ප්‍රති result ලයට හේතු වූ අතර, කප්පාදු නොකරන ලද අනුවාදය සැමවිටම මන්දගාමී විය.

පරීක්ෂණ පිටපත

#!/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

18
ඉතා හොඳ විශ්ලේෂණයකට ස්තූතියි. "මෙය යම් හැඹිලියක ප්‍රති result ලයක් යැයි මම තරයේ සැක කරමි" ඔබට මෙම විධානය ක්‍රියාත්මක කළ හැකිය: sudo sh -c "free && sync && echo 3> / proc / sys / vm / drop_caches && free" හැඹිලිය ඉවත් කිරීමට (යුනික්ස් බලන්න) . stackexchange.com/questions/87908/… ).
ndemou

-pruneමා සමඟ සිටින දෙදෙනා පිළිබඳ පරීක්ෂණ කිහිපයකින් පසුව මට කිව හැක්කේ කලාතුරකින් වෙනසක් ඇති බවය. මුලින්ම කුමන විධානය ආරම්භ කිරීම cpu කාර්ය සාධනයෙන් ප්‍රයෝජන ලබන බව මතක තබා ගන්න, පසුව cpu උණුසුම් කිරීම> කාර්ය සාධනය පහත වැටීම සුළු මන්දගාමී වීමට හේතු වේ (මම එක් එක් විධානයට පෙර හැඹිලිය පිරිසිදු කළේ @ndemou යෝජනාව අනුව)
Huy.PhamNhu

name1() name2() name3()මා පැවසූ දේ පිළිබඳ දෘශ්‍යයක් ලබා ගැනීම සඳහා ක්‍රියාත්මක කිරීමේ අනුපිළිවෙල වෙනස් කිරීමට ඉහත @BroSlow පරීක්ෂණ ස්ක්‍රිප්ටයේ අංක මාරු කිරීමට උත්සාහ කරන්න . සැබෑ ජීවිතයේ දී, ඒ දෙදෙනා අතර එය නොදැනේ.
හුයි.ෆම්හු

අත්පොලසන්. මෙම ගුණාත්මක පිළිතුරට ස්තූතියි.
ස්ටෙෆේන්

ඔබ -o නොවිය යුතුය. එබැවින් ඔබ පළමු පියවරේදී කප්පාදු කරන අතර ඊළඟට ඒ සියල්ල අමතක කරයි.
mmm

115

මට වැඩ කළ එකම එක මෙයයි.

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

"නාමාවලිය" හැර "MyFile" සඳහා සෙවීම. තරු අවධාරණය කරන්න *.


19
පිළිගත් පිළිතුර නොලැබෙන අතර මෙම ක්‍රමය මැකෝස් මත ක්‍රියා කරයි. මම දන්නවා මුල් ප්‍රශ්නය ලිනක්ස් සඳහා බව.
සේවියර් රුබියෝ ජන්සානා

6
! -path '*/Directory/*'බහලුම් නොසලකා හැරීම සඳහා ඔබට අනුපිළිවෙලින් ඔබේ විධානයට බහුවිධ එකතු කළ හැකි බව සලකන්න
Aclwitt

සමඟ docker containerපමණක් ක්‍රියා කරයිsh -c "find..."
මාර්සෙලෝ ඩි සේල්ස්

59

එක් විකල්පයක් වනුයේ grep සමඟ නාමාවලි නාමය අඩංගු සියලුම ප්‍රති results ල බැහැර කිරීමයි. උදාහරණයක් වශයෙන්:

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

45
මෙය ඔබගේ සෙවීම ඉතා මන්දගාමී වනු ඇත
ඩොරියන්

6
මෙය මා වෙනුවෙන් වැඩ කළ අතර අනෙක් අය (භාවිතා කරන -prune) - නැත.
ඇන්ඩ්‍රොන්

7
විශාල ප්‍රති results ලවල මන්දගාමී, නමුත් කුඩා කට්ටලවල ප්‍රයෝජනවත් වේ. නමුත් grep භාවිතයෙන් බහු නාමාවලි බැහැර කරන්නේ කෙසේද? ඇත්ත වශයෙන්ම මේ ආකාරයෙන්: find . -name '*.js' | grep -v excludeddir | grep -v excludedir2 | grep -v excludedir3නමුත් එක් අශෝභන ක්‍රමයක් තිබිය හැකිය.
ටිමෝ කොහ්කන්

6
ඔබට බහු ග්‍රෙප් සිදු කිරීමට අවශ්‍ය නම් එය සාමාන්‍ය ප්‍රකාශන ලෙස ලිවීමට වඩා හොඳ වනු ඇත : egrep -v '(dir1|dir2|dir3)'. කෙසේ වෙතත්, මෙම විශේෂිත සිද්ධි අධ්‍යයනයේ දී, නාමාවලි findතමන් තුළම බැහැර කිරීම වඩා හොඳය .
ලෝරන්ස්

1
ඔව්, ඔබට වරහන් වර්‍ග අවශ්‍ය නොවන අතර එය භාවිතා කිරීම වඩා හොඳය the එය ආරම්භයේදීම නාමාවලි නාමයට ගැලපෙන බව සහතික කිරීම සඳහා උදා: සොයා ගන්න. -name '* .js' | egrep -v "^ \ ./ බැහැර කරන ලද 1 | ^ \ ./ බැහැර කරන ලද 2"
සොෆිජා

41

මම -notඅංකනයට කැමතියි ... එය වඩාත් කියවිය හැකි ය:

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

5
කණගාටුයි, එය ක්‍රියා නොකරයි. සඳහා වන man පිටුව findමෙසේ කියයි: "ඩිරෙක්ටරියක් සහ එය යටතේ ඇති ගොනු නොසලකා හැරීමට, -prune භාවිතා කරන්න".
ක්‍රිස්ටියන් ඩේවන්

8
මේක වැරදියි. එය ඩිරෙක්ටරියට ඇතුළු වීම සහ ඇතුළත ඇති සියලුම ලිපිගොනු හරහා ගමන් කිරීම වළක්වන්නේ නැත.
GetFree

find . -iname '*' -and -not -path './somePath'එම නාමාවලියට ඇතුළු වීම වළක්වන්නේ නැත.
ලෙමින්ග්ස් 19

මෙය මට .git මාර්ගයට උදව් විය find . -iname '*' -not -path './.git/*'
M.academy හි මාර්ක් ෂස්ට්

7
@rane: වඩාත් නිශ්චිතවම find . -not -path "*/.git*"ඔබට අවශ්‍ය දේ වනු ඇත.
බෙන්

22

-Pruune විකල්පය භාවිතා කරන්න. ඉතින්, වැනි දෙයක්:

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

'-Type d -name proc -prune' බැහැර කිරීම සඳහා proc නම් නාමාවලි පමණක් සොයයි.
'-O' යනු 'හෝ' ක්‍රියාකරුවෙකි.


2
මා වෙනුවෙන් වැඩ කළ එකම පිරිසිදු “සොයා ගැනීම” මෙයයි. මම බැහැර කිරීමට බලාපොරොත්තු වූ නාමාවලි වත්මන් වැඩ කරන නාමාවලියට පහළින් නොපවතී.
ලැම්බාර්ට්

5
කෙසේ වෙතත්, -printඅවසානයට එකතු කිරීම ප්‍රති .ල වැඩි දියුණු කළ හැකිය. find . -type d -name .hg -prune -o -name data(බහුවිධ) .hgනාමාවලි වල අන්තර්ගතය නොසලකා හැර ඇති නමුත් .hgනාමාවලි ලැයිස්තුගත කර ඇත. සමඟ -print, එය ලැයිස්තුගත කර ඇත්තේ මා සොයන "දත්ත" නාමාවලි පමණි.
ලැම්බාර්ට්

ඔව්, පිළිගත් පිළිතුරට වඩා සැලකිය යුතු ලෙස පැහැදිලි කර ඇත. එය ක්‍රියාත්මක වේ. පහත දැක්වෙන ඒවා හැර, ලකුණු සලකුණු සොයා ගන්නා රසයක් මෙන්න /node_modules/: find . -name node_modules -prune -o -name '*.md' -ප්‍රින්ට් වැනි අමතර දේවල් එකතු කිරීමට අවශ්‍ය වීමේ වරදක් නැත, නමුත් අවම වශයෙන් මුලින් ක්‍රියාත්මක වන මූලික යමක් ලබා ගැනීමට ඉඩ දෙන්න.
ජේ.එල්. පයිරෙට්

20

-pruneනියත වශයෙන්ම ක්‍රියාත්මක වන අතර හොඳම පිළිතුර එය බැහැර කිරීමට අවශ්‍ය ඩිරයට බැස යාම වළක්වන බැවිනි. -not -pathඑය තවමත් බැහැර කරන ලද ඩර් සොයන අතර, එය ප්‍රති result ලය මුද්‍රණය නොකරයි, බැහැර කරන ලද ඩර් ජාල පරිමාව සවිකර තිබේ නම් හෝ ඔබට අවසර නොදෙන්නේ නම් එය ගැටළුවක් විය හැකිය.

උපක්‍රමශීලී කොටස නම් 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

16

සමහර මාර්ග බැහැර කිරීමට මා භාවිතා කළ ආකෘතිය මෙයයි:

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

". *" මාර්ගවල නොමැති සියලුම ගොනු සොයා ගැනීමට මම මෙය භාවිතා කළෙමි:

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

මම මෙය උත්සාහ කළ අතර එය තවමත් නාමාවලි වලට බැස ඇත, එබැවින් වේගය නිසැකවම වැඩි දියුණු නොවේ.
Br.Bill

11

-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

බහු නාමාවලි බැහැර කිරීම සඳහා:

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

නාමාවලි එක් කිරීමට, එකතු කරන්න -o -path "./dirname/*":

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

බැහැර කිරීම සඳහා බොහෝ නාමාවලි තිබේ නම් සමහර විට ඔබ සාමාන්‍ය ප්‍රකාශනයක් භාවිතා කළ යුතුය .


9

හොඳ පිළිතුරු ඕනෑ තරම් තිබේ, විධානයේ සෑම අංගයක් සඳහාම සහ එය පිටුපස ඇති තර්කනය තේරුම් ගැනීමට මට යම් කාලයක් ගත විය.

find . -path ./misc -prune -o -name '*.txt' -print

සොයා ගැනීම වත්මන් නාමාවලියෙහි ගොනු සහ නාමාවලි සොයා ගැනීම ආරම්භ කරනු ඇත, එබැවින් find ..

මෙම -oවිකල්පය, තාර්කික සඳහා කි්රයා හෝ හා විධානය කොටස් දෙකක් වෙන්:

[ -path ./misc -prune ] OR [ -name '*.txt' -print ]

./Misc නාමාවලිය නොවන ඕනෑම ඩිරෙක්ටරියක් හෝ ගොනුවක් පළමු පරීක්ෂණයෙන් සමත් නොවේ -path ./misc. නමුත් දෙවන ප්රකාශනයට එරෙහිව ඒවා පරීක්ෂා කරනු ලැබේ. ඔවුන්ගේ නම *.txtමුද්‍රණය වන රටාවට අනුරූප වන්නේ නම්-printවිකල්පය .

සොයා ගැනීම ./misc බහලුම වෙත ළඟා වූ විට, මෙම නාමාවලිය තෘප්තිමත් වන්නේ පළමු ප්‍රකාශනය පමණි. එබැවින් -pruneවිකල්පය එයට අදාළ වේ. එම නාමාවලිය ගවේෂණය නොකරන ලෙස එය සෙවුම් විධානයට පවසයි . එබැවින් ./misc හි ඇති ඕනෑම ගොනුවක් හෝ නාමාවලියක් සොයා ගැනීමෙන් පවා ගවේෂණය නොකෙරේ, ප්‍රකාශනයේ දෙවන කොටසට එරෙහිව පරීක්ෂා නොකෙරෙන අතර මුද්‍රණය නොකෙරේ.


සෑම කෙනෙකුටම විසඳුමක් ඇත, නමුත් ඔබ එය හොඳම දේ පැහැදිලි කළේය. -පාත් වෙනුවට පළමු-නම භාවිතා කිරීමට මම තදින් සිටියෙමි. මට අවශ්‍ය දේ ලබා ගැනීමට ඔබේ පැහැදිලි කිරීම ප්‍රමාණවත් විය. සොයා ගන්න. -name "* .txt" -print -o -path ./misc -prune
Vendetta V

7

වැඩ කරන විසඳුමක් සඳහා (උබුන්ටු 12.04 (නිරවද්‍ය පැන්ගෝලින්) මත පරීක්ෂා කර ඇත) ...

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

dir1 උප ෆෝල්ඩරය හැර වත්මන් ෆෝල්ඩරයේ සහ උප ෆෝල්ඩර වල MP3 ගොනු සොයනු ඇත.

භාවිත:

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

... dir1 සහ dir2 බැහැර කිරීමට


මට වැඩ කරන්නේ නැහැ. ඉහත පිළිතුරු කිසිවක් නොකරන්න. රතු තොප්පිය.
තාර්පා

7

මෙම අනුමැතිය ලබාදුන් බහලුම් මුද්රණය ගැනීම සඳහා වන හොඳ උපක්රමය භාවිතා කිරීමයි -print(සඳහා ක්රියා -execඇති දකුණු පැත්තේ පසු මෙන්ම) -orපසු -prune. උදාහරණයක් වශයෙන්, ...

find . -path "*/.*" -prune -or -iname "*.j2"

වත්මන් ඩිරෙක්ටරියට යටින් ඇති සියලුම ලිපිගොනු වල මාර්ගය “.j2” දිගුව සමඟ මුද්‍රණය කරනු ඇත, සියලු සැඟවුණු නාමාවලි මඟහරිනු ඇත. පිළිවෙලින් එය මුද්‍රණය කරනු ඇත. පහත දැක්වෙන්නේ නැත, ...

find . -path "*/.*" -prune -or -iname "*.j2" -print

තාර්කිකව ක්‍රියාකරුට -andපසුව -inameසහ මුද්‍රණයට පෙර සැඟවී ඇති බැවිනි . -orමෙහෙයුම්වල බූලියන් අනුපිළිවෙල සහ ආශ්‍රිතතාවය හේතුවෙන් මෙය වගන්තියේ දකුණු කොටසට බැඳේ. නමුත් -print(හෝ එහි ous ාති සහෝදරයන්ගෙන් කිසිවෙකු ... -print0, ආදිය) නිශ්චිතව දක්වා නොමැති නම් සැඟවුණු බව ලේඛනය පවසයි . ඉතින් -orමුද්‍රණයේ වම් කොටස නොවන්නේ ඇයි ? පෙනෙන විදිහට (සහ මගේ පළමු පිටුව කියවීමෙන් මට මෙය තේරුණේ නැත), එය සත්‍යයකි, විස්තරාත්මක ක්‍රියාකරුවන් පමණක් නොමැති නම් පෙනෙන පරිදි කිසිවක් නොකරනු ඇත, එබැවින් එය අර්ථවත් යැයි මම සිතමි. ඉහත සඳහන් කළ පරිදි, මේ සියල්ල ද ක්‍රියාත්මක වේ, එබැවින් පහත දැක්වෙන්නේ අපේක්ෂිත දිගුව සමඟ එක් එක් ගොනුව සඳහා සම්පූර්ණ ලැයිස්තුවක් ලබා දෙයි , නමුත් එක් එක් සැඟවුණු නාමාවලියෙහි පළමු මට්ටම ලැයිස්තුගත නොකිරීම, ...-print හෝ හෝ-exec අවස්ථාවකදී, මුද්‍රණය තාර්කිකව සෑම දෙයක්ම මුද්‍රණය වන පරිදි ඉසිනු ලැබේ. එකක් වුවදprint කිසිදු වගන්තියක ශෛලීය ක්‍රියාකාරිත්වයක් , එම සැඟවුණු තාර්කික සියල්ල ඉවත්ව යන අතර ඔබට ලැබෙන්නේ ඔබ සඳහන් කළ දේ පමණි. දැන් අවංකවම, මම එය වෙනත් ආකාරයකින් කැමති වන්නට ඇත, නමුත් පසුව අfind-execls -la

find . -path "*/.*" -prune -or -iname "*.j2" -exec ls -la -- {} +

මට (සහ මෙම ත්‍රෙඩ් එකේ අනෙක් අයට), findසින්ටැක්ස් ඉතා ඉක්මණින් බැරොක් එකක් ලබා දෙයි, එබැවින් මම සැමවිටම වර්‍ග තුළට විසි කරන්නේ කුමක් සඳහා බැඳී ඇත්දැයි මම දනිමි, එබැවින් මම සාමාන්‍යයෙන් ටයිප්-හැකියාව සඳහා සාර්වයක් නිර්මාණය කර එවැනි ප්‍රකාශ සියල්ලම සාදමි. ..

find . \( \( ... description of stuff to avoid ... \) -prune \) -or \
\( ... description of stuff I want to find ... [ -exec or -print] \)

මේ ආකාරයෙන් ලෝකය කොටස් දෙකකට සකස් කිරීමෙන් වැරදියට යාම දුෂ්කර ය. 30 + වන පිළිතුර කියවා ඡන්දය ප්‍රකාශ කිරීම කිසිවෙකුට අපහසු යැයි පෙනුනත්, මෙය උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි, නමුත් කෙනෙකුට බලාපොරොත්තු විය හැකිය. :-)


5

මෙය සාක්ෂාත් කර ගැනීම සඳහා ඔබට කප්පාදු විකල්පය භාවිතා කළ හැකිය. උදාහරණයක් ලෙස:

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

හෝ ප්‍රතිලෝම grep “grep -v” විකල්පය:

find -iname example.com | grep -v beta

ඔබට ලිනක්ස් සෙවුම් විධානයෙන් සවිස්තරාත්මක උපදෙස් සහ උදාහරණ සොයාගත හැකිය .


සියලුම නාමාවලි එකම නමකින් බැහැර කරන එකම ක්‍රමය grep විසඳුමයි. බෙහෙවින් ප්‍රයෝජනවත් වන "node_modules" බැහැර කිරීමට උත්සාහ කරන විට.
bmacnaughton

3
mabmacnaughton - ඇත්ත නොවේ! මම මෙහි පැමිණියේ "node_modules" බැහැර කිරීමටයි. හොඳ පිළිතුරු බොහොමයක් කියවීමෙන් පසු මම පදිංචි වුණා find . -type f -print -o -path "*/node_modules" -prune... ආදේශක කාඩ්පත භාවිතයෙන් මෙය ඕනෑම මට්ටමකින් "node_modules" මඟ හැරේ; -printපළමු විකල්පය භාවිතා කිරීමෙන් -type f -printඑම කොටස පමණක් මුද්‍රණය වේ, එබැවින් "node_modules" නාමාවලි ලැයිස්තුගත නොවේ. (එය ද ආපස්සට කළ හැක: find . -path "*/node_modules" -prune -o -type f -print)
ස්ටීවන් පී

කුමක් කරන්නේද? ඔබට බැහැර කිරීමට අවශ්‍ය නිශ්චිත ගොනුව කුමක්ද? Ypu එය ආදේශක කාඩ්පතක් ලෙස භාවිතා කරන්නේද?
සිජු වී

1
Te ස්ටෙෆන් පී, මෙය පෙන්වා දීමට ස්තූතියි; භාවිතා කිරීම ./node_modulesසහ */node_modulesඑයින් ඇති වෙනස මම ඉගෙන ගතිමි . එහිදී මගේ නඩුව සඳහා node_modulesවන මම (සහ ඒ යටතේ ඇති සෙවුම් ආරම්භ බහලුම පමණක් පවතී node_modulesබහලුම), මම භාවිතා කළ හැකි find . -type f -print -o -path "./node_modules" -prune එකක් වෙන්න නැති නිසා node_modulesවෙනත් ඕනෑම බහලුම යටතේ බහලුම.
bmacnaughton

1
IjSijuV - මා සොයන නාමාවලියෙහි node_modulesඋප බහලුමක් තිබුනි, නමුත් ඒවායේම node_modules ඇති උප බහලුම් ද තිබුණි ... ./node_modulesගැලපීම් භාවිතා කරමින් node_modulesවත්මන් නාමාවලිය යටතේ ඇති උප බහලුම පමණක් භාවිතා කර .එය කප්පාදු කරයි; භාවිතා */node_modulesකිරීම නිසා, ඕනෑම ගැඹුරු බහලුම තරග සහ නවතයි *ලෙස glob වැනි, ඕනෑම ප්රධාන මාර්ගය උපසර්ගය තරග ./test5/main/node_modules, පමණක් නොව, ./උපසර්ගය. මෙම *b වෙනුවට, නමුත් glob ලෙස regex ලෙස නොවේ.
ස්ටීවන් පී

5
find . -name '*.js' -\! -name 'glob-for-excluded-dir' -prune

මෙය වැඩ කිරීමට ලබා ගත නොහැක. find ~/Projects -name '*.js' -\! -name 'node_modules' -pruneතවමත් ලිපිගොනු node_modulesඔවුන්ගේ මාවතේ හරවා යමින් සිටී
mpen

1
@mpen, stackoverflow.com/questions/4210042/… වෙතින් , ඔබට අවශ්‍ය වාක්‍ය ඛණ්ඩය බව මම ඉගෙන ගතිමිfind ~/Projects -path ~/Projects/node_modules -prune -o -name '*.js' -print . නාමාවලිය මුද්‍රණය කිරීමට යන්නේ නම් එම මාර්ගයේ නම හරියටම මුද්‍රණය වන දේට අනුරූප විය යුතුය.
පැට්ස්

5

සමහර ලිපිගොනු ඇතුළත් කිරීමට / බැහැර කිරීමට ඔබට නිත්‍ය ප්‍රකාශන භාවිතා කළ හැකිය.

find . -regextype posix-egrep -regex ".*\.(js|vue|s?css|php|html|json)$" -and -not -regex ".*/(node_modules|vendor)/.*" 

මෙම පමණක් ඔබ සියලු JS, VUE, CSS, ආදිය ගොනු දෙන්න නමුත් සියලු ගොනු හැර ඇත node_modulesහා vendorෆෝල්ඩර.


4

පෙර පිළිතුරු කිසිවක් උබුන්ටු වල හොඳ නැත. මේක උත්සාහ කරන්න:

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

මම මෙය මෙහි සොයාගෙන ඇත


ලකුණු 100 ට වඩා වැඩි පිළිතුරු කිසිවක් උබුන්ටු මත ක්‍රියා නොකිරීමට කිසිදු හේතුවක් මා දකින්නේ නැත.
ඇක්සෙල් බෙකර්ට්

සොයා ගැනීම සෑම තැනකම එකම ලිනක්ස් බෙදාහැරීම් වල ක්‍රියාත්මක වේ - GNU ව්‍යාපෘතියෙන්. එකම වෙනස අනුවාද විය හැකිය. නමුත් පසුගිය දශකය තුළ සිදු වූ වෙනස්කම් එතරම් ආක්‍රමණශීලී නොවීය.
ඇක්සෙල් බෙකර්ට්

4
find -name '*.js' -not -path './node_modules/*' -not -path './vendor/*'

පෙනෙන ආකාරයටම ක්‍රියා කරයි

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

සහ IMO මතක තබා ගැනීම පහසුය.


4

ටීඑල්ඩීආර්:-path <excluded_path> -prune -o විකල්පය භාවිතා කර ඔබේ මූල නාමාවලි තේරුම් ගෙන එතැන් සිට ඔබේ සෙවුම සකස් කරන්න . /බැහැර කරන ලද මාර්ගය අවසානයේ පසුපසින් ඇතුළත් නොකරන්න .

උදාහරණයක්:

find / -path /mnt -prune -o -name "*libname-server-2.a*" -print


Effectively ලදායී ලෙස භාවිතා කිරීම සඳහා findඔබේ ගොනු පද්ධති නාමාවලි ව්‍යුහය පිළිබඳ මනා අවබෝධයක් තිබීම අත්‍යවශ්‍ය බව මම විශ්වාස කරමි. මගේ නිවසේ පරිගණකයේ මා සතුව බහු-ක්ෂය දෘ hard තැටි ඇත, එම අන්තර්ගතයෙන් අඩක් පමණ උපස්ථ කර ඇත rsnapshot(එනම්, rsync). භෞතිකව ස්වාධීන (අනුපිටපත්) ධාවකයකට උපස්ථ වුවද, එය මගේ පද්ධති මූල ( /) නාමාවලිය යටතේ සවි කර ඇත /mnt/Backups/rsnapshot_backups/:

/mnt/Backups/
└── rsnapshot_backups/
    ├── hourly.0/
    ├── hourly.1/
    ├── ...
    ├── daily.0/
    ├── daily.1/
    ├── ...
    ├── weekly.0/
    ├── weekly.1/
    ├── ...
    ├── monthly.0/
    ├── monthly.1/
    └── ...

මෙම /mnt/Backups/rsnapshot_backups/බහලුම සතුව ~ 60M ගොනු සහ ෆෝල්ඩර සමග, බලෙන් අල්ලාගෙන ~ 2.9 ටී.බී.; සරලවම එම අන්තර්ගතයන් ගමන් කිරීමට කාලය ගතවේ:

## As sudo (#), to avoid numerous "Permission denied" warnings:

time find /mnt/Backups/rsnapshot_backups | wc -l
60314138    ## 60.3M files, folders
34:07.30    ## 34 min

time du /mnt/Backups/rsnapshot_backups -d 0
3112240160  /mnt/Backups/rsnapshot_backups    ## 3.1 TB
33:51.88    ## 34 min

time rsnapshot du    ## << more accurate re: rsnapshot footprint
2.9T    /mnt/Backups/rsnapshot_backups/hourly.0/
4.1G    /mnt/Backups/rsnapshot_backups/hourly.1/
...
4.7G    /mnt/Backups/rsnapshot_backups/weekly.3/
2.9T    total    ## 2.9 TB, per sudo rsnapshot du (more accurate)
2:34:54          ## 2 hr 35 min

මේ අනුව, මගේ /(මූල) කොටසේ ගොනුවක් සෙවීමට අවශ්‍ය ඕනෑම වේලාවක, මගේ උපස්ථ කොටස හරහා ගමන් කිරීම (හැකි නම් වළක්වා ගන්න) සමඟ කටයුතු කිරීමට මට අවශ්‍යය.


උදාහරණ

මෙම ත්‍රෙඩ් එකේ විවිධාකාරයෙන් යෝජනා කර ඇති අය අතර ( සොයා ගැනීමේ නාමාවලිය බැහැර කරන්නේ කෙසේද? විධානය ), පිළිගත් පිළිතුර භාවිතා කරමින් සෙවීම් වඩා වේගවත් බව මට පෙනේ - අවවාද සමඟ.

විසඳුම 1

පද්ධති ගොනුව සොයා ගැනීමට මට අවශ්‍ය යැයි කියමු libname-server-2.a, නමුත් මගේ rsnapshotඋපස්ථ හරහා සෙවීමට මට අවශ්‍ය නැත . පද්ධති ගොනුවක් ඉක්මනින් සොයා ගැනීමට, බැහැර කිරීමේ මාර්ගය භාවිතා කරන්න /mnt(එනම්, භාවිතා කරන්න /mnt, නැත /mnt/, හෝ /mnt/Backups, හෝ ...):

## As sudo (#), to avoid numerous "Permission denied" warnings:

time find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a
real    0m8.644s              ## 8.6 sec  <<< NOTE!
user    0m1.669s
 sys    0m2.466s

## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:

$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt -prune -o \
    -name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
    TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 3 sec     ## ~3 sec  <<< NOTE!

... තත්පර කිහිපයකින් එම ගොනුව සොයා ගනී, මේ සඳහා වැඩි කාලයක් ගත වන අතර (සියලුම "බැහැර කරන ලද" නාමාවලි හරහා නැවත බැලීමට පෙනේ):

## As sudo (#), to avoid numerous "Permission denied" warnings:

time find / -path /mnt/ -prune -o -name "*libname-server-2.a*" -print
find: warning: -path /mnt/ will not match anything because it ends with /.
/usr/lib/libname-server-2.a
real    33m10.658s            ## 33 min 11 sec (~231-663x slower!)
user    1m43.142s
 sys    2m22.666s

## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:

$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt/ -prune -o \
    -name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
    TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 1775 sec    ## 29.6 min

විසඳුම 2

මෙම ත්‍රෙඩ් එකේ ඉදිරිපත් කර ඇති අනෙක් විසඳුම ( SO # 4210042 ) ද දුර්වල ලෙස ක්‍රියා කරයි:

## As sudo (#), to avoid numerous "Permission denied" warnings:

time find / -name "*libname-server-2.a*" -not -path "/mnt"
/usr/lib/libname-server-2.a
real    33m37.911s            ## 33 min 38 sec (~235x slower)
user    1m45.134s
 sys    2m31.846s

time find / -name "*libname-server-2.a*" -not -path "/mnt/*"
/usr/lib/libname-server-2.a
real    33m11.208s            ## 33 min 11 sec
user    1m22.185s
 sys    2m29.962s

සාරාංශය | නිගමන

හි දක්වා ඇති ප්‍රවේශය භාවිතා කරන්න විසඳුම 1 "

find / -path /mnt -prune -o -name "*libname-server-2.a*" -print

එනම්

... -path <excluded_path> -prune -o ...

/බැහැර කරන ලද මාර්ගයට ඔබ පසුපසින් එකතු කරන සෑම විටම , findවිධානය නැවත නැවත (සියල්ලටම) ඇතුල් වන බව සඳහන් කරමින්/mnt/* නාමාවලි - මගේ නඩුවේදී, /mnt/Backups/rsnapshot_backups/*උප බහලුම් නිසා, සෙවීමට ඩොලර් 2.9 TB ලිපිගොනු ඇතුළත් වේ! පසුපසින් නොපැමිණීමෙන් /සෙවීම වහාම පාහේ සම්පූර්ණ විය යුතුය (තත්පර කිහිපයකින්).

"විසඳුම 2" (... -not -path <exclude path> ... ) එලෙසම බැහැර කරන ලද නාමාවලි හරහා නැවත නැවත සෙවීම පෙනේ - බැහැර කළ තරග නැවත නොපැමිණීම, නමුත් එම සෙවුම් කාලය අනවශ්‍ය ලෙස පරිභෝජනය කිරීම.


එම rsnapshotඋපස්ථ තුළ සෙවීම :

මගේ පැයක / දිනපතා / සතිපතා / මාසික rsnapshotඋපස්ථයකින් ගොනුවක් සොයා ගැනීමට ):

$ START="$(date +"%s")" && find 2>/dev/null /mnt/Backups/rsnapshot_backups/daily.0 -name '*04t8ugijrlkj.jpg'; END="$(date +"%s")"; TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/mnt/Backups/rsnapshot_backups/daily.0/snapshot_root/mnt/Vancouver/temp/04t8ugijrlkj.jpg
find command took 312 sec   ## 5.2 minutes: despite apparent rsnapshot size
                            ## (~4 GB), it is in fact searching through ~2.9 TB)

කැදැලි නාමාවලියක් හැර:

මෙන්න, මට කැදැලි නාමාවලිය බැහැර කිරීමට අවශ්‍යයි, උදා : /mnt/Vancouver/projects/ie/claws/data/*සිට සෙවීමේදී /mnt/Vancouver/projects/:

$ time find . -iname '*test_file*'
./ie/claws/data/test_file
./ie/claws/test_file
0:01.97

$ time find . -path '*/data' -prune -o -iname '*test_file*' -print
./ie/claws/test_file
0:00.07

පසෙකින්:-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

එය මන්දගාමී වන ගොනු වල ප්‍රමාණය නොවේ find, එය පරීක්ෂා කළ යුතු නාමාවලි ඇතුළත් කිරීම් ගණන වේ . ඔබ සතුව බහු-ගිගාබයිට් ලිපිගොනු අතලොස්සක් තිබේ නම්, ඔබට බොහෝ කුඩා ගොනු (විශේෂයෙන් ඒවා සියල්ලම ගුණනය වී තිබේ නම්) තිබේ නම් එය වඩාත් නරක ය.
ටෝබි ස්පයිට්

ObTobySpeight: හොඳ කරුණක්. පරිමාණය දැක්වීමට සෙවුම් අවකාශයේ ප්‍රමාණය සඳහන් කළ අතර එහි බොහෝ ලිපිගොනු අඩංගු වේ. sudo ls -R / | wc -lRot 76.5M ලිපිගොනු සහිත මූල (/) ක්ෂණිකව සෙවීම (බොහෝමයක් "වින්‍යාස නොකරන ලද" පද්ධති ගොනු හැර උපස්ථ කර ඇත); /mnt/Vancouver/with ls -R | wc -l2.35M ලිපිගොනු සමඟ; /home/victoria/0.668M ගොනු අඩංගු වේ.
වික්ටෝරියා ස්ටුවර්ට්

3

මම findලිපිගොනු ලැයිස්තුවක් සැපයීමට භාවිතා කළ xgettextඅතර නිශ්චිත නාමාවලියක් සහ එහි අන්තර්ගතය මඟ හැරීමට අවශ්‍ය විය. මම -pathඒකාබද්ධව බොහෝ ප්‍රේරණයන් උත්සාහ කළ -pruneනමුත් මට අවශ්‍ය නාමාවලිය සම්පූර්ණයෙන් බැහැර කිරීමට නොහැකි විය.

මට නොසලකා හැරීමට අවශ්‍ය නාමාවලියෙහි අන්තර්ගතය නොසලකා හැරීමට මට හැකි වුවද, ප්‍රති the ලවලින්find එකක් ලෙස නාමාවලිය නැවත ලබා දෙන ලදී.xgettext ප්‍රති result ලයක් ලෙස බිඳ වැටීමට හේතු විය (ඩිරෙක්ටරි භාර නොගනී; ගොනු පමණක්).

මගේ විසඳුම වූයේ grep -vප්‍රති results ල වලදී මට අවශ්‍ය නොවූ නාමාවලිය මඟ හැරීම සඳහා භාවිතා කිරීමයි:

find /project/directory -iname '*.php' -or -iname '*.phtml' | grep -iv '/some/directory' | xargs xgettext

ඒ සඳහා තර්කයක් තිබේද නැද්ද යන්න find100% ක්ම ක්‍රියාත්මක වේ, මට නිශ්චිතවම පැවසිය නොහැක. grepයම් හිසරදයකින් පසු භාවිතා කිරීම ඉක්මන් හා පහසු විසඳුමක් විය.


3

මෙය මැක්හි මට සුදුසු ය:

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

එය ඉවත් කරනු ඇත vendorහා app/cacheසමග භා තා කරන සෝදිසි නම සඳහා හිස් තීරුවෙහි php.


'* .Php' වටා තනි උපුටා දැක්වීම් තැබීම වඩා හොඳය, නැතහොත් ඔබ සොයන දේ සොයා ගැනීමට යන්නේ නැත.
Br.Bill

3

භාවිතා කළ නොහැකි වූ යුනික්ස් පැරණි අනුවාද මත ඔබ අයට -path හෝ -not

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

නිශ්චිත නාමාවලියට වඩා වැඩි ගණනක් සමත් විය හැක.
MUY බෙල්ජියම

2

කෙසේද-භාවිතා කරන්නේ-කප්පාදු-විකල්පය-සොයා ගැනීම- ෂෝ හි ලෝරන්ස් ගොන්සාල්වෙස්ගේ විශිෂ්ට පිළිතුරකි-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
Stackoverflow.com/questions/4210042/… වෙතින් , මම දැනගත්තා -pathනාමාවලිය මුද්‍රණය කරන්නේ නම් මුද්‍රණය කළ හැකි නමට අනුරූප විය යුතු සින්ටැක්ස් , උදාහරණයක් ලෙස find . -path ./.git -prune -o -print, හෝ find $HOME/foo -path $HOME/foo/.git -prune -o -print සමහර පිළිතුරු -path somedirඅවාසනාවන්ත ලෙස කියන්නේ ප්‍රයෝජනවත් වීමට ප්‍රමාණවත් නොවේ.
PatS

2

මට අවශ්‍ය දේ සඳහා මෙය ක්‍රියාත්මක 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.jpgfindලැයිස්තුවෙන් එක් එක් නාමාවලිය / ප්‍රති result ල මෙන් ඕනෑම විධානයක් ක්‍රියාත්මක කරන්න


තත්පරයක් රැඳී සිටින්න, /තවම බැහැර කර නැත. ඔබට අවශ්‍ය විය හැකිය sed 1d.
සිම්බා

2

පහත දැක්වෙන විධානයන් ක්‍රියාත්මක වේ:

find . -path ./.git -prune -o -print

ඔබට සොයා ගැනීමේ ගැටලුවක් තිබේ නම්, -D treeප්‍රකාශන විශ්ලේෂණ තොරතුරු බැලීමට විකල්පය භාවිතා කරන්න .

find -D tree . -path ./.git -prune -o -print

නැතහොත් -D all, සියලු ක්‍රියාත්මක කිරීමේ තොරතුරු බැලීමට.

find -D all . -path ./.git -prune -o -print

1

සී ප්‍රභව ලිපිගොනු වල ශ්‍රිත නාමය * .o සහ බැහැර කරන්න.

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

1

ලූපයට වඩා execක්‍රියාව භාවිතා කිරීම වඩා හොඳය for:

find . -path "./dirtoexclude" -prune \
    -o -exec java -jar config/yuicompressor-2.4.2.jar --type js '{}' -o '{}' \;

මෙම exec ... '{}' ... '{}' \;වන සඟල වෙනුවට, සෑම ගැලපෙන ගොනුව සඳහා එක් වරක් ක්රියාත්මක කරනු ලැබේ '{}'වර්තමාන ගොනුව නම සමඟ.

ෂෙල් තිර රචනය විරාම ලෙස අර්ථ ඔවුන් ආරක්ෂා කිරීමට සඟල තනි උපුටා ලකුණු බහා ඇති බව දැනුම් * .


සටහන්

* Man find (GNU findutils) 4.4.2පිටුවේ EXAMPLES කොටසේ සිට


1
ඉතා පැරණි ප්‍රශ්නය, නමුත් වැඩිදියුණු කිරීම් සඳහා තවමත් ඉඩකඩ ඇත. මම අහම්බෙන් සමාන ගැටලුවක් විසඳීමට උත්සාහ කළ අතර පිළිතුරු කිසිවක් සතුටුදායක නොවීය.
ඇල්බර්ටෝ

මම execක්‍රියාව බොහෝ විට භාවිතා කරන අතර එය ඉතා ප්‍රයෝජනවත් වේ. මම සාමාන්‍යයෙන් උපුටා දැක්වීම් එකතු {}කරන්නේ ගොනු මාර්ගවල අවකාශයන් තිබේ නම් "{}".
ලුඩොවික් කුටි

ඔබගේ අදහස පිළිබිඹු කිරීම සඳහා මම මගේ ලිපිය සංස්කරණය කිරීමට සූදානම්ව සිටියෙමි, නමුත් ඉක්මන් පරීක්ෂණයකින් පසුව (උපුටා දැක්වීමකින් තොරව, {}ඒවායේ නම් වල හිස් අවකාශයන් සහිත ලිපිගොනු සඳහා වැඩ කරයි) සහ මෑන් පිටු දෙස බැලීමෙන් පසු, උපුටා දැක්වීම අවශ්‍ය වන්නේ වළක්වා ගැනීමට පමණි ඒවා ෂෙල් ස්ක්‍රිප්ට් විරාම ලකුණු ලෙස වැරදි ලෙස අර්ථ දැක්විය යුතුය. මෙම අවස්ථාවේදී, ඔබ තනි උපුටා දැක්වීමක් භාවිතා කරනු ඇත:'{}'
ඇල්බර්ටෝ

මම කරන්න කිරීම සඳහා එය භාවිතා කිරීමට ඇති බව සිතා cpහෝ mvහෝ rm. මම එය පරීක්ෂා කර
බලමි

1

මම ඉහත විධානය උත්සාහ කළෙමි, නමුත් "-ප්රූන්" භාවිතා කරන කිසිවෙකු මට වැඩ නොකරයි. අවසානයේදී මම පහත විධානයෙන් මෙය අත්හදා බැලුවෙමි:

find . \( -name "*" \) -prune -a ! -name "directory"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.