खोज…
परिचय
खोज फ़ाइलों (या निर्देशिकाओं) के लिए एक निर्देशिका को पुन: खोज करने के लिए एक कमांड है जो एक मापदंड से मेल खाता है, और फिर चयनित फ़ाइलों पर कुछ कार्रवाई करता है।
search_path चयन_ क्राइटेरिया क्रिया खोजें
वाक्य - विन्यास
- [-H] [-L] [-पी] [-D डिबगोप्ट्स] [-ओवेल] [पथ ...]:
नाम या एक्सटेंशन द्वारा फ़ाइल की खोज करना
pwd
सापेक्ष एक विशिष्ट नाम के साथ फाइल / निर्देशिका खोजने के लिए:
$ find . -name "myFile.txt"
./myFile.txt
किसी विशिष्ट एक्सटेंशन के साथ फ़ाइलों / निर्देशिकाओं को खोजने के लिए, वाइल्डकार्ड का उपयोग करें:
$ find . -name "*.txt"
./myFile.txt
./myFile2.txt
कई एक्सटेंशनों में से किसी एक से मेल खाते फ़ाइल / निर्देशिकाओं को खोजने के लिए, or
ध्वज का उपयोग करें:
$ find . -name "*.txt" -o -name "*.sh"
फ़ाइलों / निर्देशिकाओं को खोजने के लिए जो नाम एबीसी से शुरू होता है और एक अंक के बाद एक अल्फा चरित्र के साथ समाप्त होता है:
$ find . -name "abc[a-z][0-9]"
एक विशिष्ट निर्देशिका में स्थित सभी फाइलों / निर्देशिकाओं को खोजने के लिए
$ find /opt
केवल फ़ाइलों के लिए खोज करने के लिए (निर्देशिका नहीं), -type f
उपयोग करें:
find /opt -type f
केवल निर्देशिका के लिए खोज करने के लिए (नियमित फ़ाइलें नहीं), -type d
उपयोग करें:
find /opt -type d
टाइप करके फाइल्स ढूंढना
फ़ाइलों को खोजने के लिए -type f
फ्लैग का उपयोग करें
$ find . -type f
निर्देशिकाओं को खोजने के लिए, -type d
ध्वज का उपयोग करें
$ find . -type d
ब्लॉक डिवाइस को खोजने के लिए -type b
फ्लैग का उपयोग करें
$ find /dev -type b
सीमलिंक को खोजने के लिए, -type l
फ्लैग का उपयोग करें
$ find . -type l
एक पाया फ़ाइल के खिलाफ आदेशों को निष्पादित करना
कभी-कभी हमें बहुत सारी फ़ाइलों के खिलाफ कमांड चलाने की आवश्यकता होगी। यह xargs
का उपयोग करके किया जा सकता है।
find . -type d -print | xargs -r chmod 770
उपरोक्त कमांड सभी निर्देशिकाओं ( -type d
) के सापेक्ष पुन: खोज करेगा .
(जो आपकी वर्तमान कार्यशील निर्देशिका है), और उन पर chmod 770
निष्पादित करें। -r
करने का विकल्प निर्दिष्ट xargs
नहीं चलाने के लिए chmod
अगर find
किसी भी फाइल नहीं मिला।
यदि आपकी फ़ाइलों के नाम या निर्देशिका में एक स्थान चरित्र है, तो यह कमांड चोक कर सकती है; एक समाधान निम्नलिखित का उपयोग करना है
find . -type d -print0 | xargs -r -0 chmod 770
उपरोक्त उदाहरण में, -print0
और -0
झंडे निर्दिष्ट करते हैं कि फ़ाइल नामों को एक null
बाइट का उपयोग करके अलग किया जाएगा, और फ़ाइल नामों में रिक्त स्थान जैसे विशेष वर्णों के उपयोग की अनुमति देता है। यह एक GNU एक्सटेंशन है, और find
और xargs
अन्य संस्करणों में काम नहीं कर सकता है।
यह करने के लिए पसंदीदा तरीका छोड़ है xargs
कमान दो और find
उपप्रक्रिया ही फोन:
find . -type d -exec chmod 770 {} \;
यहां, {}
एक प्लेसहोल्डर है जो यह दर्शाता है कि आप उस बिंदु पर फ़ाइल नाम का उपयोग करना चाहते हैं। find
निष्पादित करेंगे chmod
व्यक्तिगत रूप से प्रत्येक फ़ाइल पर।
आप वैकल्पिक रूप से सभी फ़ाइल नामों को उपयोग करके, chmod
एक कॉल पर पास कर सकते हैं
find . -type d -exec chmod 770 {} +
यह भी उपरोक्त xargs
स्निपेट्स का व्यवहार है। (व्यक्तिगत रूप से प्रत्येक फ़ाइल पर कॉल करने के लिए, आप xargs -n1
उपयोग कर सकते हैं)।
एक तीसरा विकल्प फ़ाइल नामों की सूची पर बैश पाश जाने के लिए है find
आउटपुट:
find . -type d | while read -r d; do chmod 770 "$d"; done
यह वाक्यात्मक रूप से सबसे अधिक क्लूनी है, लेकिन सुविधाजनक है जब आप प्रत्येक मिली फ़ाइल पर कई कमांड चलाना चाहते हैं। हालाँकि, यह विषम नामों वाले फ़ाइल नामों के चेहरे पर असुरक्षित है।
find . -type f | while read -r d; do mv "$d" "${d// /_}"; done
जो अंडरस्कोर के साथ सभी नामों को फ़ाइल नामों में बदल देगा। (यह उदाहरण भी काम नहीं करेगा यदि प्रमुख निर्देशिका नामों में स्थान हैं।)
ऊपर के साथ समस्या यह है कि while read -r
प्रति पंक्ति में एक प्रविष्टि की उम्मीद करता है, लेकिन फ़ाइल नामों में नई सीमाएं हो सकती हैं (और यह भी read -r
किसी भी अनुगामी read -r
को खो देगा)। चीजों को घुमाकर आप इसे ठीक कर सकते हैं:
find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +
इस तरह, -exec
फ़ाइल नामों को एक ऐसे रूप में प्राप्त करता है जो पूरी तरह से सही और पोर्टेबल है; bash -c
उन्हें कई तर्कों के रूप में प्राप्त होता है, जो $@
में मिलेगा, सही तरीके से उद्धृत आदि (स्क्रिप्ट को इन नामों को सही ढंग से संभालने की आवश्यकता होगी, निश्चित रूप से, प्रत्येक चर जिसमें फ़ाइल नाम शामिल है, को डबल होने की आवश्यकता है; उल्लेख। उद्धरण।)
रहस्यमय _
आवश्यक है, क्योंकि bash -c 'script'
के पहले तर्क का उपयोग $0
को आबाद करने के लिए किया जाता है।
एक्सेस / संशोधन समय द्वारा फ़ाइल ढूँढना
एक ext
फाइलसिस्टम पर, प्रत्येक फाइल में एक संग्रहित एक्सेस, संशोधन और (स्थिति) होता है, जिससे जुड़ा समय बदल जाता है - इस जानकारी को देखने के लिए आप stat myFile.txt
उपयोग कर सकते हैं; खोजने के भीतर झंडे का उपयोग कर, हम फ़ाइलों को एक निश्चित समय सीमा के भीतर संशोधित किया गया खोज सकते हैं।
उन फ़ाइलों को खोजने के लिए जिन्हें पिछले 2 घंटों के भीतर संशोधित किया गया है:
$ find . -mmin -120
उन फ़ाइलों को खोजने के लिए जिन्हें पिछले 2 घंटों के भीतर संशोधित नहीं किया गया है:
$ find . -mmin +120
ऊपर के उदाहरण केवल संशोधित समय पर खोज कर रहे - एक ccess बार, या ग फांसी पर लटका दिया बार पर खोज का उपयोग करने के a
, या c
तदनुसार।
$ find . -amin -120
$ find . -cmin +120
सामान्य प्रारूप:
-mmin n
: फ़ाइल n मिनट पहले संशोधित की गई थी
-mmin -n
: फ़ाइल n मिनट पहले की तुलना में कम संशोधित की गई थी
-mmin +n
: फ़ाइल n मिनट पहले की तुलना में अधिक संशोधित की गई थी
उन फ़ाइलों को खोजें जिन्हें पिछले 2 दिनों में संशोधित किया गया है:
find . -mtime -2
उन फ़ाइलों को ढूंढें जिन्हें पिछले 2 दिनों के भीतर संशोधित नहीं किया गया है
find . -mtime +2
क्रमशः उपयोग समय और स्थिति परिवर्तन समय के लिए -atime
और -ctime
।
सामान्य प्रारूप:
-mtime n
: फ़ाइल nx24 घंटे पहले संशोधित किया गया था
-mtime -n
: फ़ाइल को nx24 घंटे पहले की तुलना में कम संशोधित किया गया था
-mtime +n
: फ़ाइल को nx24 से अधिक घंटे पहले संशोधित किया गया था
2007-06-07 से 2007-06-08 तक, दिनांक की एक श्रेणी में संशोधित फ़ाइलें खोजें:
find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
1 घंटे पहले से 10 मिनट पहले तक टाइमस्टैम्प (टाइमस्टैम्प के रूप में फ़ाइलों का उपयोग करके) की एक श्रेणी में एक्सेस की गई फ़ाइलें खोजें:
touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
timeout 10 find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print
सामान्य प्रारूप:
-newerXY reference
: वर्तमान फ़ाइल के टाइमस्टैम्प को संदर्भ के साथ तुलना करता है। XY
में निम्नलिखित मान हो सकते हैं: at
(एक्सेस टाइम), mt
(संशोधन समय), ct
(चेंज टाइम) और बहुत कुछ। reference
एक फ़ाइल whe का नाम है जो टाइमस्टैम्प निर्दिष्ट (पहुंच, संशोधन, परिवर्तन) या एक निरपेक्ष समय का वर्णन करने वाले स्ट्रिंग की तुलना करना चाहता है।
विशिष्ट एक्सटेंशन द्वारा फ़ाइलें ढूँढना
वर्तमान पथ के भीतर एक निश्चित विस्तार की सभी फाइलों को खोजने के लिए आप निम्नलिखित find
वाक्यविन्यास का उपयोग कर सकते हैं। के उपयोग यह बनाकर काम करता है bash's
निर्मित glob
निर्माण सब होने नामों से मेल खाएं .extension
।
find /directory/to/search -maxdepth 1 -type f -name "*.extension"
केवल वर्तमान निर्देशिका से .txt
प्रकार की सभी फ़ाइलों को खोजने के लिए, करें
find . -maxdepth 1 -type f -name "*.txt"
आकार के अनुसार फ़ाइलें ढूंढना
15MB से बड़ी फ़ाइलें ढूँढें:
find -type f -size +15M
12KB से कम फ़ाइलें ढूँढें:
find -type f -size -12k
12KB आकार की बिल्कुल फ़ाइलें खोजें:
find -type f -size 12k
या
find -type f -size 12288c
या
find -type f -size 24b
या
find -type f -size 24
सामान्य प्रारूप:
find [options] -size n[cwbkMG]
एन-ब्लॉक आकार की फाइलें खोजें, जहां एन-एन का मतलब एन-ब्लॉक से अधिक है, -एन का मतलब एन-ब्लॉक से कम है और एन (बिना किसी संकेत के) का मतलब बिल्कुल एन-ब्लॉक है
ब्लॉक का आकार:
-
c
: बाइट्स -
w
: 2 बाइट्स -
b
: 512 बाइट्स (डिफ़ॉल्ट) -
k
: 1 केबी -
M
: 1 एमबी -
G
: 1 जीबी
पथ को छानो
-path
पैरामीटर परिणाम के पथ से मेल खाने के लिए एक पैटर्न निर्दिष्ट करने की अनुमति देता है। पैटर्न नाम से भी मेल खा सकता है।
केवल पथ (फ़ोल्डर या नाम) में कहीं भी log
युक्त फ़ाइलें खोजने के लिए:
find . -type f -path '*log*'
log
(किसी भी स्तर पर) नामक एक फ़ोल्डर के भीतर केवल फाइलों को खोजने के लिए:
find . -type f -path '*/log/*'
केवल log
या data
नामक एक फ़ोल्डर के भीतर फाइलें खोजने के लिए:
find . -type f -path '*/log/*' -o -path '*/data/*'
bin
कहे जाने वाले फ़ोल्डर में निहित सभी फाइलों को खोजने के लिए:
find . -type f -not -path '*/bin/*'
bin
या लॉग फाइल नामक फोल्डर में मौजूद सभी फाइलों को छोड़कर सभी फाइलों को खोजने के लिए:
find . -type f -not -path '*log' -not -path '*/bin/*'