bash

2013-01-23 14 views
5

में वर्णमाला के अनुसार खोज (नेस्टेड निर्देशिकाओं सहित) के परिणामों को क्रमबद्ध करने के लिए कैसे करें I bash में "find" कमांड चलाने के परिणामों के आधार पर निर्देशिकाओं की एक सूची है। उदाहरण के लिए, खोज का परिणाम फ़ाइलें हैं:bash

test/a/file 
test/b/file 
test/file 
test/z/file 

मैं उत्पादन सॉर्ट करने के लिए तो यह रूप में प्रकट होता हैं:

test/file 
test/a/file 
test/b/file 
test/z/file 

वहाँ खोजने के आदेश के भीतर परिणाम सॉर्ट करने के लिए कोई तरीका है, या परिणाम को पाइप करके?

उत्तर

9

आप खोजने की जीएनयू संस्करण है, तो यह प्रयास करें:

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' 

एक पाश में इन फ़ाइल नामों का उपयोग करने के लिए, प्रत्येक फ़ाइल के लिए

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' | while read file; do 
    # use $file 
done 

खोजने आदेश प्रिंट तीन बातें करते हैं: (1) इसकी निर्देशिका, (2) निर्देशिका पेड़ में इसकी गहराई, और (3) इसका पूरा नाम। आउटपुट में गहराई को शामिल करके हम sort -ntest/filetest/a/file से ऊपर क्रमबद्ध करने के लिए उपयोग कर सकते हैं। अंत में हम पहले दो कॉलम को बाहर करने के लिए awk का उपयोग करते हैं क्योंकि इन्हें केवल सॉर्ट करने के लिए उपयोग किया जाता था।

तीन क्षेत्रों के बीच विभाजक के रूप में \0 का उपयोग करके हम उन्हें रिक्त स्थान और टैब के साथ फ़ाइल नामों को संभालने की अनुमति देते हैं (लेकिन दुर्भाग्य से न्यूलाइन नहीं)।

$ find test -type f 
test/b/file 
test/a/file 
test/file 
test/z/file 
$ find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F'\0' '{print $3}' 
test/file 
test/a/file 
test/b/file 
test/z/file 

आप find आदेश को संशोधित करने में असमर्थ हैं, तो यह जटिल प्रतिस्थापन की कोशिश:

find test -type f | while read file; do 
    printf '%s\0%s\0%s\n' "${file%/*}" "$(tr -dc/<<< "$file")" "$file" 
done | sort -t '\0' | awk -F'\0' '{print $3}' 

यह एक ही बात करता है, ${file%/*} के साथ एक फ़ाइल की निर्देशिका नाम पाने के लिए इस्तेमाल किया जा रहा है और tr आदेश स्लेश की संख्या को गिनने के लिए उपयोग किया जा रहा है, जो कि फ़ाइल की "गहराई" के बराबर है।

(मुझे यकीन है कि वहाँ एक आसान जवाब वहाँ बाहर है उम्मीद है। क्या आप पूछ रहे हैं कि कठिन प्रतीत होता है, लेकिन मैं एक सरल समाधान पर रिक्त कर रहा हूँ।)

+1

मैं इस बैकअप स्क्रिप्ट के हिस्से के रूप में इस कमांड का उपयोग कर रहा हूं। अधिमानतः मैं उम्मीद कर रहा था कि मैं फाइल के लिए 'के साथ कुछ कर सकता हूं ... | क्रमबद्ध करें ... ' – Ken

+0

@ केन मेरा संपादन देखें। 'ढूंढें ... | जबकि फाइल को पढ़ने के लिए 'फ़ाइल में' को प्राथमिकता दी जानी चाहिए (ढूंढें ...) '। उत्तरार्द्ध व्हाइटस्पेस-सुरक्षित नहीं है, धीमा है, और कमांड लाइन पर फिट होने के लिए बहुत सारे फ़ाइल नाम होने पर त्रुटि हो सकती है। –

-1

इस प्रयास करें। संदर्भ के लिए, यह पहले दूसरे क्षेत्र दूसरे द्वार पर है। जो केवल फाइल पर मौजूद है, और इसके विपरीत आर के लिए आर है, इसका अर्थ यह है कि इसके बाद यह दूसरे क्षेत्र के पहले चार को क्रमबद्ध करेगा। [आयकर क्षेत्र deliminator है, -k कुंजी है]

find test -name file |sort -t'/' -k2.2r -k2.1 

अधिक जानकारी के लिए एक info sort है। अलग-अलग परिणाम प्राप्त करने के लिए -टी और -के का उपयोग करने के विभिन्न तरीकों का एक टन है।

+0

यह उदाहरण फ़ाइल नामों को सॉर्ट करने के लिए एक अजीब विशिष्ट और क्लेगी तरीका है। यह एक सामान्य समाधान नहीं है। –