कमांड आउटपुट खोजें से रास्ता निकालें


29

मेरे पास बीटा वातावरण से उत्पादन वातावरण में कोड को तैनात करने के लिए एक बैश स्क्रिप्ट है, लेकिन वर्तमान में मुझे फ़ाइलों की सूची को txt फ़ाइल manaully और कभी-कभी कुछ याद आती है। मूल रूप से मेरी परिनियोजन स्क्रिप्ट बिल्ली / लूप्स फाइलों की नकल करती है। (निर्यात / आयात db के रूप में अच्छी तरह से है, लेकिन यह प्रासंगिक नहीं है)

वैसे भी, मैं findपिछले 14 दिनों में संशोधित फ़ाइलों की सूची तैयार करने के लिए कमांड का उपयोग करना चाहूंगा । समस्या यह है कि मुझे ./काम करने के लिए तैनाती स्क्रिप्ट के लिए रास्ता निकालना होगा ।

यहां कमांड कमांड के उपयोग का एक उदाहरण दिया गया है:

खोजो। -Type f -mtime -14> तैनाती। txt

यहाँ लाइन है कि deploy.txtमेरी तैनाती स्क्रिप्ट में बिल्लियों :

for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done

किसी भी विचार कैसे मार पटकथा का उपयोग कर इसे पूरा करने के लिए?

धन्यवाद!


3
क्या कोई कारण है कि आप इसके लिए rsync का उपयोग नहीं कर सकते? ऐसा लगता है जैसे आप पहिया को फिर से बनाने और इसे त्रिकोण बनाने की कोशिश कर रहे होंगे।
ThatGraemeGuy 21

परिनियोजन से पहले वैध बिंदु हालांकि ।.txt की समीक्षा की जाती है और फिक्सिंग की आवश्यकता वाली किसी भी चीज़ को हटा दिया जाता है
मिकी 1980

1
शायद --dry-runमोड और आउटपुट में rsync चलाते हैं जो समीक्षा के लिए फ़ाइल में है?
ज़ोराचे २ Z

जवाबों:


36

आप बिना किसी निर्देशिका जानकारी के सिर्फ फ़ाइल नाम प्रिंट करने के लिए -printfकमांड लाइन विकल्प का उपयोग कर सकते हैं%f

find . -type f -mtime -14 -printf '%f\n' > deploy.txt

या आप सिर्फ हटाने के लिए sed का उपयोग कर सकते हैं। "

find . -type f -mtime -14 | sed 's|^./||' >deploy.txt

मेरा मानना ​​है कि आपको बचना होगा /.
ईईएए

5
जब आप |सीमांकक के रूप में उपयोग नहीं करते हैं ।
user9517

3
का उपयोग करके %fसभी निर्देशिकाओं को बंद कर देंगे, न कि केवल ./। यदि उसकी कोई भी फाइल findउपनिर्देशिका में स्थित है तो उसकी तैनाती स्क्रिप्ट को तोड़ देगी ।
जेम्स स्नेनर

2
@ अगर आपको भागने की जरूरत .नहीं है। और शायद एक स्टार्ट-इन-लाइन एंकर का उपयोग करना सबसे अच्छा है:s|^\./||
जेम्स ओ'गॉर्मन

12
के %Pबजाय का उपयोग करें %f। यह सिर्फ कमांड लाइन में दिए गए रास्ते को काट देता है।
ट्रू

11

./हानिरहित होना चाहिए। अधिकांश कार्यक्रम उपचार /foo/barऔर /foo/./barसमतुल्य होंगे। मुझे लगता है कि यह बहुत अच्छा नहीं लगता है, लेकिन आपने जो पोस्ट किया है, उसके आधार पर मुझे कोई कारण नहीं दिखता कि यह आपकी स्क्रिप्ट को विफल कर देगा।

यदि आप वास्तव में इसे उतारना चाहते हैं, sedतो शायद सबसे साफ तरीका है:

find . -type d -mtime 14 | sed -e 's,^\./,,' > deploy.txt

यदि आप GNU के साथ एक सिस्टम पर हैं (जैसे अधिकांश लिनक्स सिस्टम), तो आप इसे एक शॉट में कर सकते हैं find -printf:

find . -type d -mtime 14 -printf "%P\n" > deploy.txt

%Pरिटर्न प्रत्येक फ़ाइल का पूरा पथ पाया, शून्य से पथ कमांड लाइन पर निर्दिष्ट किया है, अप करने के लिए और पहले स्लैश भी शामिल है। यह आपकी निर्देशिका संरचना में किसी भी उपनिर्देशिका को संरक्षित करेगा।


1
./उपसर्ग वास्तव में एक सुविधा है; इसके बिना, अन्य कमांड में पाइपिंग आउटपुट सही ढंग से काम नहीं करेगा जैसे फ़ाइल नामों के लिए जो डैश के साथ शुरू होता है।
त्रिवेणी

1
@tripleee - मुझे इसकी उपयोगिता समझ में आती है, लेकिन ओपी ने विशेष रूप से पूछा कि इसे कैसे उतारना है क्योंकि यह उनकी तैनाती की स्क्रिप्ट के लिए समस्या पैदा कर रहा था। ज़रूर, वहाँ बेहतर तरीके से किया जा सकता है कि उसे क्या करने की ज़रूरत है, लेकिन यह एक खरगोश छेद है जो कि पूछा गया था के दायरे से परे है।
जेम्स स्नेनरिंग

7

आपको स्ट्रिप करने की आवश्यकता क्यों है ./? एक मार्ग में होना मान्य है। इसलिए

cp -i dir1/./somefile dir2/./somefile

बस ठीक है!

लेकिन अगर आप खोजने में निर्देशिका का नाम %Pछीनना चाहते हैं तो आप arg to का उपयोग कर सकते हैं -printf

आदमी खोज (1) कहता है:

         %P     File's name with the name of the  command  line  argument
                 under which it was found removed.

एक उदाहरण

$ find other -maxdepth 1
other
other/CVS
other/bin
other/lib
other/doc
other/gdbinit
$ find other -maxdepth 1 -printf "%P\n"

CVS
bin
lib
doc
gdbinit

पहली खाली लाइन को ध्यान में रखें! अगर आप इसके इस्तेमाल से बचना चाहते हैं-mindepth 1

$ find other -mindepth 1 -maxdepth 1 -printf "%P\n"
CVS
bin
lib
doc
gdbinit

3

वैसे आपके पास कुछ विकल्प हैं। आप -printfकेवल फ़ाइल नाम को प्रिंट करने के लिए विकल्प का उपयोग कर सकते हैं, या आप एक उपकरण का उपयोग कर सकते हैं, जैसे कि सेड बस स्ट्रिप आउट करने के लिए./

# simply print out the filename, will break if you have sub-directories.
find . -mtime -14 -printf '%f\n'

# strip a leading ./
find .  -mtime -14 | sed -e 's/^\.\///'

क्या आप मुझे इसके उपयोग का उदाहरण दे सकते हैं? क्षमा करें, linux वास्तव में मेरा किला नहीं है
मिकी 1980

2
फिर से देखें, उदाहरण हैं।
ज़ोराचे २ Z

सहमत - बस इसे आज़माएं, आप कुछ भी खोजने और सीड के संयोजन को चलाने के लिए चोट नहीं करने जा रहे हैं।
ईईएए

3

"find -printf" समाधान FreeBSD पर काम नहीं करेगा क्योंकि पाते हैं कि ऐसा कोई विकल्प नहीं है। इस मामले में AWK मदद कर सकता है। यह एक अंतिम नाम ($ एनएफ) देता है, इसलिए यह किसी भी गहराई पर काम कर सकता है।

find /usr/local/etc/rc.d -type f | awk -F/ '{print $NF}'

PS: D.Tansley "लिनक्स और यूनिक्स शेल प्रोग्रामिंग" पुस्तक से लिया गया


2

एक त्वरित समाधान, अगर मैं सही ढंग से प्रश्न को समझता हूं, कमांड cutके आउटपुट पर उपयोग कर रहा है find:

$> find . -type f -mtime -14 | cut -b 3- > deploy.txt

यह परिणाम की प्रत्येक पंक्ति (आपके मामले में ./) से वर्णों की पहली पट्टी करेगा । शायद सबसे अच्छा समाधान नहीं है, लेकिन आपके परिदृश्य में काम करता है।


1

sed इस तरह की बात के लिए एकदम सही है।

$ find . -type f -mtime -14 find . | sed 's/^\.\///' > deploy.txt

1

मुझे नहीं पता कि हम किस तरह के फ़ाइलनामों के बारे में बात कर रहे हैं, लेकिन रिक्त स्थान या newlines के साथ कुछ भी यहां अधिकांश समाधान जोखिम में डालते हैं।

मेरा सुझाव प्रत्येक फ़ाइल नाम से वर्णों की पट्टी करने के लिए शेल के पैरामीटर विस्तार का उपयोग करना होगा:

find . -mtime -14 -exec sh -c 'printf "${0#./}\n"' {} \; >deploy.txt

यदि आप वास्तव में पाइप पसंद करते हैं, तो आप एक "सुरक्षित" सीमांकक का उपयोग कर सकते हैं, एक नल की तरह, xargs के साथ प्रत्येक फ़ाइल नाम प्राप्त करने के लिए:

find . -mtime -14 -print0 | xargs -0 -n 1 sh -c 'printf "${0#./}\n"' >deploy.txt

याद रखें कि इस का उत्पादन होता है नहीं , जबकि यह एक नेत्रगोलक की जांच के लिए पर्याप्त हो सकता है, अशक्त-सीमांकित हां, तो इन समाधानों में से कोई भी, एक deploy.txt फ़ाइल है कि स्वचालन के लिए उपयोग करने के लिए सुरक्षित है का उत्पादन जब तक आप अपने स्रोत के बारे में बहुत विश्वास कर रहे हैं फ़ाइल नाम।

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