2012-12-19 11 views
5

मैं एक विशिष्ट फ़ाइल खोजने के लिए रिकर्सिव रूप से निर्देशिकाओं को पार करने का एक तरीका ढूंढ रहा हूं, फिर खोज को रोकें और फ़ाइल नाम को एक अजीब फ़ंक्शन या कुछ समान पाइप करें। I asked a question earlier that was similar, लेकिन मेरे अलावा मशीनों पर परीक्षण करने के बाद यह locate कमांड काम नहीं करेगा क्योंकि हर कोई इसे अपने सिस्टम पर उपयोग नहीं करता है।एक विशिष्ट फ़ाइल ढूंढें, फिर पाइप को stdout/awk

कोड है कि मैं के साथ प्रयोग किया खोजें:

dir="/path/to/destination/"; 
mkdir "$dir"; 
locate -l 1 target_file.txt | \ 
    awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | \ 
    sh 
+0

उपयोग करने के लिए आप – Heisenbug

+0

@Heisenbug का पता लगाने के बजाय खोज का उपयोग कर सकते हैं - मैंने इसके बारे में सोचा, लेकिन वास्तव में कुछ ऐसा नहीं मिला जो विशिष्ट था एक फ़ाइल खोजने के लिए fic। क्या मैं इसे उसी तरह इस्तेमाल करूँगा जैसा मैंने 'पता' के साथ किया था? धन्यवाद –

उत्तर

6

find(1) आदेश यह करना होगा। केवल एक पंक्ति प्राप्त करने के लिए, head(1) का उपयोग करें।

dir="/path/to/destination/"; 
mkdir "$dir"; 
find /path/location -name target_file.txt | 
    head -n 1 | 
    awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | 
    sh 
+0

अच्छा - हालांकि एक सवाल; चूंकि एक प्रारंभिक निर्देशिका निर्दिष्ट किए बिना फ़ाइल को कम या कम पाता है, मैं इसे आपके उदाहरण के साथ कैसे प्राप्त करूं? यानी '/ path/location /' –

+0

@SamOlde पर खोजना शुरू करें आप '.' से'/path/location' को बदलते हैं। मैंने इसे दिखाने के लिए जवाब संपादित किया। – kmkaplan

+0

- पूरी तरह से काम करता है! बहुत बहुत धन्यवाद :) –

1

क्या आप जानते हैं केवल एक फ़ाइल तो मौजूद है, तो आप

find ./ -name "target_file.txt" -exec cp -r {} $dir \;

उपयोग कर सकते हैं और अगर आप सुनिश्चित नहीं हैं, उपयोग सिर 1 को सीमित करने और xargs

find ./ -name "target_file.txt" | head -1 | xargs -I {} cp -r {} $dir/

+0

मुझे पता है कि एक से अधिक फाइल मौजूद हैं, हालांकि मैं केवल पहले पाए गए परिणाम का परिणाम प्राप्त करना चाहता हूं। उदाहरणों के लिए धन्यवाद; मेरी इच्छा है कि खोज 'पता' जितनी तेज हो: -/ –

+0

अतिरिक्त स्विच जोड़कर तेजी से बनाया जा सकता है। उदाहरण के लिए यदि आप जानते हैं कि फ़ाइल दो से अधिक डीआईआर स्तरों से नीचे नहीं होगी, तो आप -मैक्सडेप 2 जोड़ सकते हैं और टाइप प्रकार का उपयोग करके केवल फाइल को खोजने के लिए खोज को सीमित कर सकते हैं। तो आप सभी को खोजने का प्रयास कर सकते हैं ./ -name "target_file.txt" -type f -maxdepth 2 | सिर -1 | xargs -I {} cp -r {} $ dir/ –

+0

निश्चित रूप से अच्छी जानकारी; स्विच के साथ भी यह अभी भी उतना तेज़ नहीं है जितना मैं चाहता हूं। मैं आपकी बातों का जिक्र करने के लिए समय निकालने की सराहना करता हूं। :) –

संबंधित मुद्दे