কীভাবে ডিরেক্টরিতে বাদ দিতে হয় lude হুকুম


1378

আমি 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
@ এমপিপিস সঠিকভাবে পড়ার সময় হোয়াইটস্পেসের সাথে পুরো লাইনগুলি পরিচালনা করে।
জিন-ফিলিপ পেলিট

1
শুধু তাদের নামে ব্যবধান সহ ফাইল ফোল্ডারে এই সঞ্চালন করুন: for file in $(find .); do echo "$file"; done। স্পেস সহ নামগুলি বিভক্ত হয়, যা আমরা চাই না।
জিন-ফিলিপ পেলিট 10

উত্তর:


1139

-pruneসুইচটি ব্যবহার করুন । উদাহরণস্বরূপ, আপনি যদি miscডিরেক্টরিটি বাদ দিতে চান তবে আপনার সন্ধানের -path ./misc -prune -oআদেশে একটি যুক্ত করুন :

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 ), সাথে Andedtype -d

পরবর্তী ক্রিয়াটি হ'ল -o print, শুধু মুদ্রণ করুন।


89
হুম। এটি আমার পক্ষে কাজ করে না কারণ এটি আউটপুটটিতে উপেক্ষা করা ডিরেক্টরি "./misc" অন্তর্ভুক্ত করবে।
থুনি

84
@ থুনি সম্ভবত এটি আপনার পক্ষে কার্যকর হয়নি কারণ আপনি -printস্পষ্টভাবে পরে কোনও (বা অন্য কোনও পদক্ষেপ) যুক্ত করেন নি -name-oসেক্ষেত্রে , উভয় "পক্ষ" প্রিন্টিং শেষ হয়, আপনি যদি ব্যবহার করেন তবে -printকেবল সেই পাশের মুদ্রণ।
ড্যানিয়েল সি সোব্রাল

4
ম্যানপেজ থেকে: Because -delete implies -depth, you cannot usefully use -prune and -delete together.সুতরাং, যদি আমি মুছে ফেলা থেকে নির্দিষ্ট ডিরেক্টরি বাদ দিতে চাই তবে কীভাবে সন্ধানটি মুছতে হবে?
জোনিস এলমারিস

15
ফলাফল ব্যবহার থেকে সমগ্র ডিরেক্টরির নিজেই মুছে ফেলার জন্য: find . -not -path "./.git*"। ব্যবহার ./dir*পরিবর্তে ./dir/*অপসারণ ডিরেক্টরির সেইসাথে আউটপুট থেকে বিষয়বস্তু।
micahblu

64
এই প্রশ্নটি এবং উত্তরের বিভ্রান্তিগুলি ব্যবহারকারীদের প্রয়োজনের সাথে ফাইন্ড ইউজার ইন্টারফেসটি কতটা খারাপভাবে মেলে তার একটি প্রকাশ।
জোহানেস ওভারম্যানn

1931

যদি আপনার -pruneপক্ষে কাজ না করে তবে এটি হবে:

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

কেভেট: অযাচিত ডিরেক্টরিগুলি সমস্তকেই অনুসরণ করতে হবে।


86
গৃহীত উত্তরের একটি মন্তব্য সমস্যাটিকে নির্দেশ করে। -pruneডিরেক্টরিটি নিজেই বাদ দেয় না, এটির বিষয়বস্তু বাদ দেয়, যার অর্থ আপনি বাদ না হওয়া ডিরেক্টরি সহ আউটপুটে একটি অযাচিত লাইন পেতে চলেছেন।
getFree

94
দুর্দান্ত উত্তর। আমি এই যোগ চাই আপনাকে প্রথমে পরিবর্তন করে কোন স্তরে একটি ডিরেক্টরি অগ্রাহ্য করতে .করতে *। সুতরাং find -name "*.js" -not -path "*/omitme/*"গভীরতার যে কোনও স্তরে "ওমিটমে" নামের একটি ডিরেক্টরি থেকে ফাইলগুলি বাদ দেওয়া হবে।
DeDee

83
এটা এখনও ঘোরে , যদিও অবাঞ্ছিত ডিরেক্টরির সব। আমি আমার নিজের উত্তর যুক্ত করছি। :-)
ড্যানিয়েল সি সোব্রাল

18
তবে নোট করুন, কেবলমাত্র যদি আপনি -printস্পষ্টভাবে ব্যবহার না করেন তবে ছাঁটাই বিকল্পটি কাজ করে না ।
ড্যানিয়েল সি সোব্রাল

39
এটি বলা ভাল হবে "এটি প্রিন্ট ব্যবহারের বিকল্প" is -প্রণালীটি প্রদত্ত উত্তরগুলি পরিষ্কারভাবে ভুল নয়, তারা এটি করার মতো নয়।
জিম্বো

458

অন্যান্য প্রস্তাবিত সমাধানের চেয়ে নিম্নোক্ত কারণগুলি সম্পর্কে সহজ মনে করি:

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 য়ে সব অলৌকিক কাজ যে কিছু, একবার এটি পৌঁছেছেন, যে ডিরেক্টরি নীচের ফাইল স্থায়ীভাবে উপেক্ষিত হয়।

এটি আসল ব্যবহারের ক্ষেত্রে থেকে আসে, যেখানে উইন্টারস্মিথ দ্বারা উত্পাদিত কিছু ফাইলগুলিতে আমাকে ইউই-কমপ্রেসর কল করার দরকার ছিল, তবে অন্য ফাইলগুলি যা প্রেরণে প্রেরণ করা দরকার তা ছাড়ি।


দ্রষ্টব্য [1] : আপনি যদি বাদ দিতে চান /tmp/foo/barএবং আপনি এটির মতো সন্ধান করেন find /tmp \(...তবে অবশ্যই আপনাকে অবশ্যই উল্লেখ করতে হবে -path /tmp/foo/bar। অন্যদিকে আপনি যদি এটির মতো চালান cd /tmp; find . \(...তবে আপনাকে অবশ্যই নির্দিষ্ট করতে হবে -path ./foo/bar


37
অসামান্য উত্তর, আপনাকে ধন্যবাদ। এটি একাধিক ব্যতিক্রমের জন্য স্কেলযোগ্য (পঠনযোগ্য) কাজ করে। আপনি একজন ভদ্রলোক এবং পন্ডিত স্যার। একাধিক
ছাড়ের

7
আমি -ডিলেট স্যুইচটি ব্যবহার করতে চাইলে এটি কাজ করে না: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.
জোনিস এলমারিস

17
@ জ্যানিস আপনি এর -exec rm -rf {} \;পরিবর্তে ব্যবহার করতে পারেন -delete
ড্যানিয়েল সি সোব্রাল

11
এর আউটপুট পরীক্ষা করে find, এটি সত্যিই সুস্পষ্ট, তবে এটি আমাকে ছড়িয়ে দিয়েছে। আপনি বর্তমান ডিরেক্টরির মধ্যে অনুসন্ধান করা হয় যদি (নির্দিষ্ট করে .সন্ধানের পাথ হিসাবে, বা না এ সব এক নির্দিষ্ট), আপনি সম্ভবত আপনার প্যাটার্ন পর চান -pathদিয়ে শুরু করতে ./, যেমন: find -not \( -path ./.git -prune \) -type f
জানটিয়ার

7
এই পদ্ধতির আরও সুনির্দিষ্ট (এবং পসিক্স সামঞ্জস্যপূর্ণ) প্রকরণ: আপনার find searchdir \! \( -type d \( -path './excludedir/*' -o -path './excludedir2/*' -o -path './excludedir3/*' \) -prune \)সন্ধানের সাথে মেলে এমন কোনও শর্ত অনুসরণ করা।
ওয়াল্ফ 26'17

217

ডিরেক্টরিটি এড়িয়ে যাওয়ার জন্য পছন্দসই সিনট্যাক্সটি কী হবে সে সম্পর্কে এখানে কিছুটা বিভ্রান্তি রয়েছে।

জিএনইউ মতামত

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

GNU থেকে ম্যান পৃষ্ঠাটি সন্ধান করুন

যুক্তি

-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' {} \;হয়েছে)। ফলাফল নীচে

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

উপসংহার

এফ 10 বিটের সিনট্যাক্স এবং ড্যানিয়েল সি সোব্রালের সিনট্যাক্স উভয়ই গড়ে গড়ে 10-25 মিমি নিয়েছে। গেটফ্রি এর সিনট্যাক্স , যা ব্যবহার করে না -prune, এটি 865ms নিয়েছে। সুতরাং, হ্যাঁ এটি একটি চরম উদাহরণ, তবে আপনি যদি রান সময় সম্পর্কে চিন্তা করেন এবং দূরবর্তীভাবে নিবিড় কিছু করছেন তবে আপনার ব্যবহার করা উচিত -prune

দ্রষ্টব্য ড্যানিয়েল সি-prune সোব্রালের সিনট্যাক্স দুটি সিনট্যাক্সের চেয়ে আরও ভাল পারফরম্যান্স করেছে ; তবে, আমি দৃ strongly়ভাবে সন্দেহ করি যে এটি ক্রমের পরিবর্তনে কিছুটা ক্যাচিংয়ের ফলাফল যার ফলে দু'জনের বিপরীত ফলাফল হয়েছিল, অন্যদিকে ছাঁটাইযুক্ত সংস্করণটি সর্বদা সবচেয়ে ধীর ছিল।

পরীক্ষা স্ক্রিপ্ট

#!/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
একটি খুব ভাল বিশ্লেষণের জন্য আপনাকে ধন্যবাদ। "আমার দৃ suspect়ভাবে সন্দেহ হয় এটি কিছু ক্যাশেগের পরিণতি" সম্পর্কে আপনি এই কমান্ডটি চালাতে পারেন: sudo sh -c "বিনামূল্যে && Sync && echo 3> / proc / sys / vm / ড্রপ_ক্যাচস && বিনামূল্যে" ক্যাশে সাফ করার জন্য ( ইউনিক্স দেখুন)। stackexchange.com/questions/87908/… )।
এনডেমো

এই দুটি নিয়ে কয়েকটি পরীক্ষার পরে -prune আমি বলতে পারি যে খুব কমই কোনও পার্থক্য রয়েছে। মনে রাখবেন যে প্রথমে কোন কমান্ড শুরু হবে সিপিইউ পারফরম্যান্স থেকে উপকৃত হবে, পরে সিপিইউ উষ্ণ হয়> পারফরম্যান্স ড্রপটি সামান্য ধীর হয়ে যায় (আমি প্রতিটি আদেশের আগে ক্যাশে সাফ করেছিলাম @ ডেমো পরামর্শ হিসাবে)
হুই.পামনহু

name1() name2() name3()আমি যা বলেছিলাম তার সম্পর্কে ভিজ্যুয়াল পেতে ক্রিয়াকলাপ ক্রম পরিবর্তন করতে উপরের ব্রোলো পরীক্ষা স্ক্রিপ্টের মধ্যে স্যুইচ নম্বর চেষ্টা করুন । বাস্তব জীবনে, যদিও এই দুজনের মধ্যে এটি অপ্রয়োজনীয়।
Huy.PhamNhu

হাততালি। এই মানের উত্তরের জন্য আপনাকে ধন্যবাদ।
স্ট্যাফনে

আপনার হওয়া উচিত নয় যার অর্থ বা। সুতরাং আপনি প্রথম পদক্ষেপে ছাঁটাই করছেন এবং তারপরে পরবর্তী সব কিছু ভুলে যাচ্ছেন।
মিমি

93

এটিই আমার পক্ষে কাজ করেছে।

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

"ডিরেক্টরি" বাদে "মাইফাইল" অনুসন্ধান করা হচ্ছে। তারকাদের উপর জোর দিন *।


13
এই পদ্ধতিটি ম্যাকোজে কাজ করে যখন গৃহীত উত্তরটি দেয় না। আমি জানি মূল প্রশ্নটি লিনাক্সের জন্য।
জাভিয়ের রুবিও জনসানা

5
নোট করুন যে ! -path '*/Directory/*'একাধিক ডিরেক্টরি উপেক্ষা করার জন্য আপনি ক্রমান্বয়ে আপনার কমান্ডে একাধিক যুক্ত করতে পারেন
অ্যাকলুইট

MacOS এ কাজ করে তবে এটি লিনাক্সে নেই ... নিশ্চিত হয়েছে
মার্সেলো দে বিক্রয়

একটি docker containerমাত্র সঙ্গে কাজ করেsh -c "find..."
মার্সেলো ডি সেলস

@ মার্সেলো দে বিক্রয় অবশ্যই এটি লিনাক্সে কাজ করে।
দিমিডাক

59

একটি বিকল্প হ'ল গ্রীপ সহ ডিরেক্টরি নাম থাকা সমস্ত ফলাফলকে বাদ দেওয়া। উদাহরণ স্বরূপ:

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

44
এটি আপনার অনুসন্ধানটি খুব ধীর করে দেবে
ডোরিয়ান

6
এটি আমার জন্য কাজ করেছে, অন্যরা (যা ব্যবহার করে -prune) - তা করে না।
অ্যান্ড্রন

7
বড় ফলাফলগুলিতে ধীর হলেও ছোট সেটগুলিতে কার্যকর useful কিন্তু কিভাবে গ্রেপ ব্যবহার করে একাধিক ডিরেক্টরি বাদ দেবেন? অবশ্যই এইভাবে: find . -name '*.js' | grep -v excludeddir | grep -v excludedir2 | grep -v excludedir3তবে কিছুটা গ্রেপ উপায় থাকতে পারে।
টিমো কাহকেনেন

6
আপনি একাধিক greps সম্পাদন করতে চান তাহলে আপনি রেগুলার এক্সপ্রেশনের হিসাবে এটি লেখা বন্ধ ভালো হতে হবে: egrep -v '(dir1|dir2|dir3)'। যাইহোক, এই নির্দিষ্ট কেস স্টাডিতে findনিজের মধ্যে ডিরেক্টরিগুলি বাদ দেওয়া ভাল ।
লরেন্স

1
হ্যাঁ, এবং আপনার প্রথম বন্ধনী প্রয়োজন নেই এবং এটি স্ট্রিংয়ের শুরুতে ডিরেক্টরি নামের সাথে মেলে তা নিশ্চিত করার জন্য এটি ব্যবহার করা ভাল: যেমন: সন্ধান করুন। -নাম '* .js' | egrep -v "^ \ ./ excludeddir1 | ^ \ ./ excludeddir2"
মধ্যে Sofija

41

আমি -notস্বরলিপিটি পছন্দ করি ... এটি আরও পাঠযোগ্য:

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

5
দুঃখিত, এটি কাজ করে না। ম্যান পেজটি findবলেছেন: "ডিরেক্টরি এবং এর অধীনে থাকা ফাইলগুলিকে উপেক্ষা করতে -প্রুনে" ব্যবহার করুন।
খ্রিস্টান দাভেন

8
এটা ভুল. এটি ডিরেক্টরিতে প্রবেশ করা এবং সমস্ত ফাইল ভিতরে প্রবেশ করা থেকে বাধা দেয় না।
getFree

find . -iname '*' -and -not -path './somePath'এটি ডিরেক্টরিতে প্রবেশ করতে বাধা দেয় না।
Lemmings19

এটি আমাকে .git পাথে সহায়তা করেছে find . -iname '*' -not -path './.git/*'
মার্ক শস্ট এম.কেডেমি

7
@ অরণ্য: find . -not -path "*/.git*"আপনি যা চান তা আরও সুনির্দিষ্টভাবে হবে।
বেন

20

-আপনিটি ব্যবহার করুন। সুতরাং, এর মতো কিছু:

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

'-Type d -name proc -prune' কেবলমাত্র বাদ দেওয়ার জন্য প্রক নামের নামের ডিরেক্টরি অনুসন্ধান করে।
'-O' একটি 'ওআর' অপারেটর।


1
এটিই একমাত্র বিশুদ্ধ- "অনুসন্ধান" সমাধান যা আমার পক্ষে কাজ করেছিল। যে ডিরেক্টরিগুলি আমি বাদ দিতে চাইছিলাম তা বর্তমান কার্যনির্বাহী ডিরেক্টরিগুলির নীচে নয়।
ল্যাম্বার্ট

5
তবে -printশেষের দিকে যোগ করা ফলাফলের উন্নতি করতে পারে। find . -type d -name .hg -prune -o -name data(একাধিক) .hgডিরেক্টরিগুলির বিষয়বস্তু উপেক্ষা করে , তবে .hgডিরেক্টরিগুলি তাদের তালিকাভুক্ত করে। এর সাথে -print, এটি কেবলমাত্র "ডেটা" ডিরেক্টরিগুলি তালিকাভুক্ত করেছিল যা আমি খুঁজছিলাম।
ল্যামবার্ট

19

-pruneঅবশ্যই কার্যকরভাবে কাজ করে এবং এটি সর্বোত্তম উত্তর কারণ এটি আপনাকে যে বাদ দিতে চাইছে সেই ডিয়ারের মধ্যে নামতে বাধা দেয়। -not -pathএটি এখনও বাদ পড়া দির সন্ধান করে, এটি কেবল ফলাফলটি মুদ্রণ করে না, বাদ দেওয়া দির যদি নেটওয়ার্ক ভলিউম মাউন্ট করা থাকে বা আপনি অনুমতি না দেন তবে এটি একটি সমস্যা হতে পারে।

কৌতূহলোদ্দীপক অংশটি 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

10

-পথ -প্রিউন পদ্ধতির পথে ওয়াইল্ডকার্ডগুলির সাথেও কাজ করে। এখানে একটি সন্ধানের বিবৃতি দেওয়া হয়েছে যা গিট অভ্যন্তরীণ ডিরেক্টরিগুলি বাদ দিয়ে একাধিক গিট সংগ্রহস্থল পরিবেশন করা গিট সার্ভারের জন্য ডিরেক্টরিগুলি খুঁজে পেতে পারে:

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 এ থাকা যে কোনও ফাইল বা ডিরেক্টরি অনুসন্ধান করেও অনুসন্ধান করা যাবে না, অভিব্যক্তির দ্বিতীয় অংশের বিরুদ্ধে পরীক্ষা করা হবে না এবং মুদ্রণযোগ্য হবে না।


সবার সমাধান পেয়েছে তবে আপনারা এটি সর্বোত্তমভাবে ব্যাখ্যা করেছেন। আমি -পথের পরিবর্তে প্রথমে নাম ব্যবহার করতে অনড় ছিলাম। আপনার ব্যাখ্যাটি আমি যা চাই তা পৌঁছানোর পর্যাপ্ত ছিল। অনুসন্ধান . -নাম "* .txt" -প্রিন্ট-ও -পথ। / মিস-প্রুন
ভি

7

কার্যক্ষম সমাধানের জন্য (উবুন্টু 12.04 (যথাযথ পাঙ্গোলিন) এ পরীক্ষিত) ...

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

Dir1 সাবফোল্ডার বাদে বর্তমান ফোল্ডার এবং সাবফোল্ডারগুলিতে এমপি 3 ফাইল অনুসন্ধান করবে।

ব্যবহার করুন:

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

... dir1 এবং dir2 বাদ দিতে


আমার জন্য কাজ করে না। উপরোক্ত উত্তরগুলির মধ্যে একটিও নেই। লাল টুপি.
থারপা

6

মুদ্রণ ছেঁটে ডিরেক্টরি এড়ানো জন্য একটি ভাল কৌতুক ব্যবহার করা -print(জন্য কাজ -execডান দিকে পর পাশাপাশি) -orপর -prune। উদাহরণ স্বরূপ, ...

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

directory .j2 "এক্সটেনশন দিয়ে বর্তমান ডিরেক্টরি নীচে সমস্ত ফাইলের পাথ মুদ্রণ করবে, সমস্ত গোপন ডিরেক্টরিকে এড়িয়ে চলেছে। ঝরঝরে। তবে এটি উপরে উল্লিখিত হিসাবে প্রতিটি ডিরেক্টরিতে পুরোপুরি পাথ প্রিন্টও প্রিন্ট করবে। তবে, নিম্নলিখিত না, ...

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

কারণ যৌক্তিকভাবে অপারেটরের -andপরে -inameএবং প্রিন্টের আগে একটি লুকানো আছে । এটি -orবুলিয়ান ক্রম এবং ক্রিয়াকলাপের ক্রমের কারণে এটিকে ধারাটির ডান অংশে আবদ্ধ করে । তবে দস্তাবেজগুলি বলছে -printযে এটি (বা এর কোনও কাজিন্স ... -print0ইত্যাদি) নির্দিষ্ট না করা থাকলে একটি গোপন বিষয় রয়েছে। তাহলে -orমুদ্রণের বাম অংশটি কেন নয় ? স্পষ্টতই (এবং আমি ম্যান পৃষ্ঠাটি প্রথম পাঠ করে এটি বুঝতে পারি নি), এটি সত্য যদি কোনও ক্লাসে স্টাইল অপারেশন প্রকাশ করা না হয় তবে এই সমস্ত লুকানো যৌক্তিকতা চলে যায় এবং আপনি কেবল যা নির্দিষ্ট করেন তা পেয়ে যান। এখন খোলামেলাভাবে, আমি এটিকে প্রায় অন্য উপায়ে পছন্দ করতে পারি, তবে তারপরে ক-print বা-exec ক্ষেত্রে, -প্রিন্টটি যৌক্তিকভাবে এমনভাবে ছড়িয়ে দেওয়া হয় যে সবকিছু মুদ্রিত হয়। এমনকি যদি একprintfind কেবল বর্ণনামূলক অপারেটরগুলির সাথে দৃশ্যত কিছুই করতে পারত না, তাই আমি অনুমান করি এটি যেমন বোধগম্য। উপরে উল্লিখিত হিসাবে, এটি সমস্ত -execপাশাপাশি কাজ করে , সুতরাং নিম্নলিখিতগুলি ls -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

বা বিপরীতমুখী গ্রেপ "গ্রেপ-ভি" বিকল্প:

find -iname example.com | grep -v beta

আপনি বিস্তারিত নির্দেশাবলীর এবং উদাহরণ জানতে পারেন অনুসন্ধানের থেকে লিনাক্স find কমান্ডের অগ্রাহ্য ডিরেক্টরি


গ্রেপ দ্রবণটি কেবলমাত্র একই নামে সমস্ত ডিরেক্টরি বাদ দেয় directories "নোড_মডিউলগুলি" বাদ দেওয়ার চেষ্টা করার সময় এটি বেশ কার্যকর।
বমাকনফটন

3
@ বিম্যাকনফটন - সত্য নয়! আমি এখানে বিশেষত "নোড_মডিউল" বাদ দিতে চেয়েছি এবং অনেক উত্তম উত্তর পড়ার পরে আমি স্থির হয়েছি find . -type f -print -o -path "*/node_modules" -prune... ওয়াইল্ডকার্ড ব্যবহার করে কোনও স্তরে "নোড_মডিউলগুলি" এড়িয়ে যায়; -printপ্রথম বিকল্পটি ব্যবহার করে -type f -printকেবল সেই অংশটি মুদ্রণ করা যায়, সুতরাং "নোড_মডিউলগুলি" ডিরেক্টরিগুলি নিজেরাই তালিকাভুক্ত নয়। (এটিও বিপরীত হতে পারে find . -path "*/node_modules" -prune -o -type f -print:)
স্টিফেন পি

সেখানে কি করছে / করছে। আপনি সঠিক ফাইলটি কী বাদ দিতে চান? আপনি কি ওয়াইল্ডকার্ড হিসাবে এটি ব্যবহার করছেন?
সিজু ভি

1
@ স্টেফেনপি, এটি দেখানোর জন্য ধন্যবাদ; আমি এটি ব্যবহার ./node_modulesএবং এর মধ্যে পার্থক্য শিখেছি */node_modules। আমার ক্ষেত্রে, যেখানে node_modulesকেবলমাত্র ডিরেক্টরিটিতে উপস্থিত রয়েছে আমি অনুসন্ধানটি (এবং সেই node_modulesডিরেক্টরিতে অন্তর্ভুক্ত) শুরু করি, আমি ব্যবহার করতে পারি find . -type f -print -o -path "./node_modules" -prune কারণ node_modulesঅন্য কোনও ডিরেক্টরিতে কোনও ডিরেক্টরি থাকবে না ।
বমাকনফটন

1
@ সিজুভি - আমি যে ডিরেক্টরিটিতে সন্ধান করছিলাম সেখানে একটি node_modulesউপ-ডিরেক্টরি ছিল , তবে এমন একটি উপ-ডিরেক্টরি ছিল যা তাদের নিজস্ব নোড_মডিউল ছিল ... বর্তমান ডিরেক্টরিতে ./node_modulesকেবল সাব-ডিরেক্টরিকে মেলে এবং এটি ছাঁটাই করে; ডিরেক্টরিটি কোনও গভীরতার সাথে ম্যাচগুলি এবং ছাঁটাইগুলি ব্যবহার করে , কারণ গ্লোব হিসাবে কোনও অগ্রণী পথের উপসর্গের সাথে মেলে, যেমন , কেবল উপসর্গই নয়। একটি ওয়াইল্ড কার্ড, কিন্তু একটি Regex যেমন নয় উল্লিখিত glob হিসাবে। node_modules.*/node_modules*./test5/main/node_modules./*
স্টিফেন পি

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

এই এক কাজ করতে পারেন না। তাদের পথে find ~/Projects -name '*.js' -\! -name 'node_modules' -pruneএখনও ফাইলগুলি সরিয়ে node_modules
আনা হচ্ছে

1
@mpen থেকে stackoverflow.com/questions/4210042/... , আমি শিখেছি যে সিনট্যাক্স আপনি চান যে find ~/Projects -path ~/Projects/node_modules -prune -o -name '*.js' -print। ডিরেক্টরিটির মুদ্রণ করতে গেলে সেই পথটির নাম অবশ্যই খুঁজে বের করতে পারে যা মুদ্রণ করবে তা অবশ্যই মিলবে।
প্যাটস

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

হিসাবে একই কাজ বলে মনে হচ্ছে

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

এবং আইএমও মনে রাখা সহজ।


4

টিএলডিআর: আপনার মূল ডিরেক্টরিগুলি বুঝতে এবং সেখান থেকে -path <excluded_path> -prune -oবিকল্পটি ব্যবহার করে আপনার অনুসন্ধানটি উপযুক্ত করুন। একটি পিছনে অন্তর্ভুক্ত করবেন না/বাদ দেওয়া পথের শেষে ।

উদাহরণ:

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


findআমি কার্যকরভাবে ব্যবহার করতে আমার বিশ্বাস যে আপনার ফাইল সিস্টেম ডিরেক্টরি কাঠামো সম্পর্কে ভাল ধারণা থাকা জরুরী। আমার বাড়ির কম্পিউটারে আমার মাল্টি-টিবি হার্ড ড্রাইভ রয়েছে, যার প্রায় অর্ধেক সামগ্রীর ব্যাক আপ রয়েছে 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

সুতরাং, যে কোনও সময় আমার /(মূল) পার্টিশনে কোনও ফাইল সন্ধান করা দরকার, আমার ব্যাকআপগুলি পার্টিশনটি অতিক্রম করে (সম্ভব হলে এড়ানো) মোকাবেলা করতে হবে।


উদাহরণ

এই থ্রেডে প্রস্তাবিত বিভিন্নভাবে যোগাযোগের মধ্যে ( কীভাবে একটি ডিরেক্টরিকে ফাইন্ড কমান্ডে বাদ দিতে হয় ), আমি দেখতে পেয়েছি যে গ্রহণযোগ্য উত্তর ব্যবহার করে অনুসন্ধানগুলি অনেক দ্রুত - ক্যাভ্যাট সহ।

সমাধান ঘ

ধরা যাক আমি সিস্টেম ফাইলটি খুঁজতে চাই 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!

... দেখে যে মাত্র কয়েক সেকেন্ডের মধ্যে ফাইল, 'এই নাও যখন অনেক লম্বা ( "বাদ" ডিরেক্টরি সব দিয়ে recurse উপস্থিত):

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

এই থ্রেডে প্রদত্ত অন্যান্য সমাধান ( এসও # 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 টিবি ফাইল অন্তর্ভুক্ত করে! একটি ট্রেলিং সংযোজন না করে/ করে অনুসন্ধানটি তাত্ক্ষণিকভাবে শেষ করা উচিত (সেকেন্ডের মধ্যে)।

"সমাধান 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, এটি অবশ্যই ডিরেক্টরি তালিকা পরীক্ষা করতে হবে। সুতরাং আপনার কাছে যদি অনেকগুলি, অনেক ছোট ফাইল থাকে (বিশেষত যদি সেগুলি সমস্ত গুণিত সংযুক্ত থাকে!) আপনার কাছে হাতে গোনা কয়েকটি মাল্টি-গিগাবাটি ফাইল থাকে তবে এটি আরও খারাপ।
টবি স্পিড 9

@ টবিস্পাইট: ভাল পয়েন্ট। আমি স্কেল নির্দেশ করতে অনুসন্ধানের জায়গার আকার উল্লেখ করেছি, এতে অনেকগুলি ফাইলও রয়েছে। Root sudo ls -R / | wc -l76.5M ফাইলগুলি ইঙ্গিত করে (/) মূলের দ্রুত অনুসন্ধান (বেশিরভাগটি "নন-কনফিগারেশন" সিস্টেম ফাইল ব্যতীত ব্যাক আপ করা হয়েছে); indicates 2.35M ফাইল ইঙ্গিত /mnt/Vancouver/সহ ls -R | wc -l; /home/victoria/0.668M ফাইল রয়েছে।
ভিক্টোরিয়া স্টুয়ার্ট

4

আপনি কিছু ফাইল অন্তর্ভুক্ত / বাদ দিতে / এই জাতীয় কিছু ব্যবহার করে আপনার অনুসন্ধানকে নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন:

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

এটি কেবল আপনাকে সমস্ত জেএস, ভ্যু, সিএসএস ইত্যাদি ফাইল দেবে তবে সমস্ত ফাইল node_modulesএবং vendorফোল্ডারগুলিকে বাদ দিয়ে ।


3

আমি এর findজন্য ফাইলগুলির একটি তালিকা সরবরাহ করতে ব্যবহার করছিলাম xgettextএবং একটি নির্দিষ্ট ডিরেক্টরি এবং এর সামগ্রীগুলি বাদ দিতে চাই। আমি -pathএকত্রিত করার জন্য বহু ক্রমের অনুমতি দিয়েছি-prune কিন্তু যে ডিরেক্টরিটি আমি যেতে চেয়েছিলাম তা সম্পূর্ণরূপে বাদ দিতে পারিনি।

যদিও আমি যে ডিরেক্টরিটিকে উপেক্ষা করতে চেয়েছিলাম সেই বিষয়বস্তুগুলিকে উপেক্ষা করতে সক্ষম হয়েছি, findতবে ডিরেক্টরিটি নিজেই ফলাফলের মধ্যে একটি হিসাবে ফিরে এসেছে, যার কারণxgettext ফলস্বরূপ ক্রাশ (ডিরেক্টরিগুলি কেবল ফাইলগুলি গ্রহণ করে না)।

আমার সমাধানটি কেবলমাত্র grep -vডিরেক্টরিটি বাদ দিতে ব্যবহার করা হয়েছিল যা আমি ফলাফলগুলিতে চাই না:

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

এটির জন্য একটি যুক্তি রয়েছে কি না find100% কাজ করবে, আমি নিশ্চিত করে বলতে পারি না। grepকিছু মাথা ব্যথার পরে ব্যবহার করা একটি দ্রুত এবং সহজ সমাধান ছিল।


3

পূর্ববর্তী উত্তরগুলির কোনওটিই উবুন্টুতে ভাল নয়। এটা চেষ্টা কর:

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

আমি এটি এখানে পেয়েছি


আমি 100 টিরও বেশি পয়েন্ট সহ উত্তরগুলির উবুন্টুতে কাজ না করার কোনও কারণ আমি দেখতে পাচ্ছি না।
এক্সেল বেকার্ট 0

মিমি দেখি? কারণ আমি তাদের সব চেষ্টা করেছি?
সিকরো

সমস্ত লিনাক্স বিতরণে সর্বত্র একই প্রয়োগ রয়েছে - জিএনইউ প্রকল্পের একটি। পার্থক্য শুধুমাত্র সংস্করণ হতে পারে। তবে গত দশকে পরিবর্তনগুলি আক্রমণাত্মক ছিল না, কেবল অনুমতি মিলে বাদে।
এক্সেল বেকার্ট

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 ব্যাশ 3.2 এবং সানোজ 5.11 ব্যাশ 4.4 এ পরীক্ষিত

find . -type f -name "*" -o -type d -name "*excluded_directory*" -prune -type f

নির্দিষ্ট ডিরেক্টরি থেকে বেশি পাস করতে পারে।
মিউইউ বেলজিয়াম

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
স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ৪২১০০২২/২ থেকে , আমি শিখেছি যে -pathডিরেক্টরিটির মুদ্রণ করার জন্য প্রয়োজনীয় নামের জন্য ব্যবহৃত সিনট্যাক্সটি অবশ্যই মুদ্রিত হবে সেই নামের সাথে মেলে, উদাহরণস্বরূপ find . -path ./.git -prune -o -print, বা find $HOME/foo -path $HOME/foo/.git -prune -o -print উত্তরগুলির মধ্যে কিছু কেবল বলে -path somedirযা দুর্ভাগ্যবশত দরকারী হিসাবে যথেষ্ট সঠিক না।
প্যাটস

2

আমার যা প্রয়োজন তার জন্য এটি landscape.jpgএইভাবে কাজ করেছিল, সমস্ত সার্ভারে মূল থেকে শুরু করে অনুসন্ধানে এবং /varডিরেক্টরিটি অনুসন্ধান বাদ দিয়ে :

find / -maxdepth 1 -type d | grep -v /var | xargs -I '{}' find '{}' -name landscape.jpg

find / -maxdepth 1 -type dসমস্ত ডি ডিরেক্টরিতে তালিকাবদ্ধ/

grep -v /var তালিকা থেকে `/ var 'বাদ দেয়

xargs -I '{}' find '{}' -name landscape.jpgযে কোনও কমান্ড কার্যকর করুন, যেমন findপ্রতিটি ডিরেক্টরি / তালিকা থেকে ফলাফলের মতো


এক সেকেন্ড অপেক্ষা করুন, /এখনও বাদ নেই। আপনার প্রয়োজন হতে পারে 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 এবং বাদ * .swp বাদ এবং (নিয়মিত ফাইল নয়) এবং এই কমান্ডের সাহায্যে dir আউটপুট বাদ দেওয়া:

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 ... '{}' ... '{}' \;ধনুর্বন্ধনী প্রতিস্থাপন প্রত্যেক ম্যাচিং ফাইলের জন্য একবার মৃত্যুদন্ড কার্যকর করা হবে, '{}'বর্তমান ফাইলের নাম দিয়ে।

লক্ষ্য করুন যে বন্ধনীগুলি শেল স্ক্রিপ্ট বিরামচিহ্ন * হিসাবে ব্যাখ্যা থেকে তাদের রক্ষা করতে একক উদ্ধৃতি চিহ্নগুলিতে আবদ্ধ রয়েছে ।


মন্তব্য

* উদাহরণ অধ্যায় থেকে find (GNU findutils) 4.4.2man পৃষ্ঠা


1
খুব পুরানো প্রশ্ন, তবে এখনও উন্নতির জন্য জায়গা রয়েছে। আমি এটি একটি অনুরূপ সমস্যা সমাধানের চেষ্টা করে খুঁজে পেয়েছি এবং উত্তরগুলির কোনওটিই সন্তোষজনক নয়।
আলবার্তো

আমি execক্রিয়াটি প্রায়শই ব্যবহার করি এবং এটি খুব দরকারী বলে মনে করি। {}ফাইল পাথগুলির মধ্যে শূন্যস্থান রয়েছে এমন ক্ষেত্রে আমি সাধারণত এর মধ্যে উদ্ধৃতিগুলি যোগ করি "{}"
লুডোভিক কিউটি

@ এলকুটি আমি আপনার মন্তব্যটি প্রতিবিম্বিত করতে আমার পোস্টটি সম্পাদনা করতে চলেছিলাম, তবে দ্রুত পরীক্ষা করার পরে (উদ্ধৃতি ব্যতীত, {}তাদের নামের সাথে শ্বেত স্পেসযুক্ত ফাইলগুলির জন্য কাজ করে) এবং ম্যান পৃষ্ঠাগুলি একবার অনুসন্ধান করার পরে মনে হয় যে উদ্ধৃতিগুলি কেবল এড়াতে প্রয়োজনীয়? এগুলি শেল স্ক্রিপ্ট বিরামচিহ্ন হিসাবে ভুল ব্যাখ্যা করা যেতে পারে। এই ক্ষেত্রে, আপনি একক উদ্ধৃতি ব্যবহার করবেন:'{}'
আলবার্তো

আমি মনে করি যে আমি এটা করতে ব্যবহার করতে হয়েছে cpবা mvঅথবা rm। আমি এটি যাচাই করবো
লুডোভিচ কিউটি

1

আমি উপরের কমান্ডটি ব্যবহার করে দেখেছি, তবে "-প্রুন" ব্যবহার করা কেউই আমার পক্ষে কাজ করে না। শেষ পর্যন্ত আমি নীচের কমান্ড দিয়ে এটি চেষ্টা করেছিলাম:

find . \( -name "*" \) -prune -a ! -name "directory"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.