क्या कोई सरल रूप है। मैक ओएस एक्स और लिनक्स पर "" "substring_of_filename *"?


4

Mac OS X या Linux पर, कमांड का एक सरल रूप है

find . -name "*substring_of_filename*"

जो substring_of_filenameवर्तमान निर्देशिका (या कुछ अन्य दी गई निर्देशिका) के भीतर वाले सभी फ़ाइलों को खोजने के लिए है । क्योंकि यह एक सामान्य बात है, क्या कमांड को छोटा और टाइप करने में आसान बनाने का एक तरीका है, संभवतः बैश में एक उपनाम या फ़ंक्शन का उपयोग करना? या क्या कुछ अन्य आसान-से-प्रकार का आदेश है जिसका उपयोग किया जा सकता है?

जैसे कि:

findfile . substring_of_filename

( नोट: मूल रूप से लिखा गया प्रश्न app_config substring_of_filenen के उदाहरण के रूप में उपयोग किया गया है ।)


2
locate app_config
15

1
@ इकलौती: लेकिन locateवर्तमान डायर के लिए यह प्रतिबंधित नहीं है और यह उपविजेता है।
उपयोगकर्ता अज्ञात

जवाबों:



3

यहां आपका बैश फ़ंक्शन है, इसे इसमें डालें .bashrc:

function findfiles { find "$1" -iname "*$2*"; }

(ध्यान दें कि -inameखोज मामले को असंवेदनशील बनाता है। यदि आप ऐसा नहीं चाहते हैं, तो -nameइसके बजाय उपयोग करें ।)


यदि आप इसे केवल वर्तमान सत्र के लिए उपयोग करना चाहते हैं, तो आप इसे बैश सत्र में भी चला सकते हैं।
वफ़र्स

inameसमतुल्य नहीं है, nameहै। यह आपका पसंदीदा उपयोग हो सकता है, लेकिन यह सवाल नहीं था।
उपयोगकर्ता अज्ञात

2

Au contraire! एक और भी जटिल है, लेकिन एक, जो काम करता है:

find . -name "*app_config*"

ग्नू-खोज के लिए डॉट neccessary नहीं है:

find -name "*app_config*"

लेकिन आपको एस्टेरिक्स को मास्क करना होगा, अन्यथा उन्हें शेल द्वारा व्याख्या किया जाएगा, और आपको केवल फ़ाइल नाम मिलेंगे जो मौजूदा निर्देशिका में मेल खाते हैं, जो " app_config " से मेल खाते हैं ।


कम से कम मैक ओएस एक्स पर सही नहीं लगता है

क्या सच नहीं लगता? कि आप डॉट को छोड़ सकते हैं? या वह फ़ाइल जिसमें उसके नाम में 'app_config' है और जो वर्तमान निर्देशिका में है, खोज को उसके नाम तक सीमित कर देगा।
उपयोगकर्ता अज्ञात 15

मेरा मतलब है मैक ओएस एक्स पर, आप find . -name *app_config*उद्धरण के बिना उपयोग कर सकते हैं

1
@BenU: मेरे पास Mac OS X वाला सिस्टम नहीं है, लेकिन लिनक्स पर, शेल से उद्धरण की आवश्यकता उत्पन्न होती है। अगर मैं "*" का उद्धरण नहीं देता, तो शेल इसे विस्तारित करने की कोशिश करता है। यह खोजने के लिए आवश्यक नहीं है, और नहीं, यदि वर्तमान डायर में * कुछ मेल नहीं खाता है - तो इसे खोजने के लिए अपरिवर्तित रखा गया है। आप एकल उद्धरणों की कोशिश कर सकते हैं, जिन्हें बहुत अधिक अनुमति दी जाती है, लेकिन -name "*.pdf.$id"उदाहरण के लिए चर विस्तार (जो कि मामला नहीं है, यहां, लेकिन कभी-कभी और) को रोकना होगा ।
उपयोगकर्ता अज्ञात

1
रिकॉर्ड के लिए, उद्धरण को ओएस एक्स में उसी तरह इस्तेमाल किया जाना चाहिए जैसे कि लिनक्स में ओएस एक्स के समान बैश शेल है।
अर्ने स्टेंस्ट्रम

1

इसे या तो अपने में डालें ~/.profileया फिर ~/.bashrcयह सुनिश्चित न करें कि कौन सा मैक इस्तेमाल करता है:

findname () 
{ 
    find . -name "*$1*"
}

तब फ़ंक्शन को कॉल करें findname name_of_file

यदि आप कई शब्दों का उपयोग करना चाहते हैं, तो आपको अधिक जटिल होना पड़ेगा..इस तरह से मैं यह सोच सकता हूं कि यह सबसे आसान तरीका है:

findname() 
{ 
    find .|grep $1|grep $2|grep $3|grep $4 
}

यह आपके वर्तमान dir में प्रत्येक फ़ाइल को ढूँढेगा, स्ट्रिंग 1 की खोज करेगा, फिर स्ट्रिंग 2, और आदि के लिए उस परिणाम को खोजें, जब तक कि यह 4 तक न हो जाए।


जब तक चर की तरह उद्धृत नहीं किया जाता है तब तक दूसरा फ़ंक्शन काम नहीं करता है find . |grep "$1" |grep "$2" |grep "$3" |grep "$4"। इसके अलावा, यह फ़ाइल नाम के कुछ हिस्सों के बजाय पथ के कुछ हिस्सों की खोज करता है।
Arne Stenström

0

इसके बजाय एक बाश, zsh, tsh, sh, आदि ... स्क्रिप्ट में ऐसा करने के बजाय मैंने एक TextExpander शॉर्टकट बनाया । मैं sh≤Space type और TE प्रकार लिखता हूं

खोजो। -मेरा नाम "**"

और तारांकन के बीच कर्सर रखता है।


0

ओएस एक्स पर, केवल पता लगाने का उपयोग क्यों न करें? ग्रांट को डिफ़ॉल्ट रूप से बहुत बार अपडेट नहीं किया जाता है, लेकिन आप इसे आसानी से बदल सकते हैं (ओएस एक्स पर समय-समय पर काम को बदल सकते हैं)। पता लगाएँ कि एक BSDism है, यह नहीं जानते कि यह लिनक्स पर है या नहीं।


कुछ परिदृश्यों में स्थित सुरक्षा जोखिम है। LUKS- एन्क्रिप्टेड होम डायरेक्टरी + एनक्रिप्टेड रूट + अपडेटेड इंडेक्सिंग / होम और इसके कैश को कहीं / / var (जो एनक्रिप्टेड नहीं है) को फाइलनेम / घर से लीक करना।
22

0

अधिकांश लिनक्स वितरण पर, आप पता लगा सकते हैं। उदाहरण के लिए:

$ locate find | grep bin
/sbin/findfs
/usr/bin/find
/usr/bin/find2perl
/usr/bin/findsmb
/usr/bin/gst-typefind-0.10
/usr/bin/memdiskfind
/usr/bin/oldfind
/usr/bin/sane-find-scanner
/usr/include/c++/4.5/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp

0

यदि आप bash 4 (with shopt -s globstar) या zsh का उपयोग करते हैं:

prinftf %s\\n **/*substring_of_filename*

0

जवाब न है"। जीएनयू में "मौजूदा निर्देशिका में या उससे नीचे के फ़ाइल नाम के साथ फाइल खोजें" के लिए कोई आशुलिपि नहीं है find। इस सीमा के आसपास काम करने के लिए मैं जिन उपनामों का उपयोग करता हूं, वे इस प्रकार हैं zsh:

# find file in cwd by [S]ubstring, case [I]nsensitive, change to first sub[D]irectory
finds()   { find .  -name "*$**"; }
findsi()  { find . -iname "*$**"; }
findsid() { cd `find . -iname "*$**" | head -n1 | xargs dirname`; }

आखिरी मेरा पसंदीदा है। इन्हें निम्नानुसार इस्तेमाल किया जा सकता है:

> ls -R
.:
file1  File2  HOLEFILE  test

./test:
hello

(यह परीक्षण निर्देशिका है)

> findsi file
./HOLEFILE
./File2
./file1

> finds file
./file1

> finds le
./File2
./file1

> findsid ell
> ls
hello

यदि कोई भी उन्हें अपनी पसंद के शेल में पोर्ट करता है, तो इस पोस्ट को संपादित करने और अपना संस्करण जोड़ने के लिए स्वतंत्र महसूस करें।
एलेक्स हिरजेल

-1

मुझे लगता है कि सिर्फ grep इसे ठीक कर सकता है, खोजने की कोई आवश्यकता नहीं है। मैनपेज से प्रासंगिक विकल्प:

 -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)

 -H, --with-filename
          Print  the  file  name for each match.  This is the default when
          there is more than one file to search.

 -R, -r, --recursive
          Read all  files  under  each  directory,  recursively;  this  is
          equivalent to the -d recurse option.

ध्यान दें कि भले ही -H जब एक से अधिक फ़ाइल खोजने के लिए डिफ़ॉल्ट हो, तब भी मैं आपको स्पष्ट रूप से इसका उपयोग करने का सुझाव देता हूं। यह स्विच आपकी एक विशेष समस्या को हल करता है, किनारे के मामले (एकाधिक फ़ाइलों की खोज) की तुलना में सीधे इस संबंधित बिट को याद रखना बेहतर है जब यह विकल्प डिफ़ॉल्ट होता है।

तो आपके मूल खोज कमांड का grep संस्करण इस तरह दिखेगा:

grep -lHR app_config .

2
मुझे संदेह है कि "सभी फाइलें इसमें app_config वाली हैं" वास्तव में "उनके नाम में app_config वाली सभी फाइलें" हैं।
एरोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.