2008-09-12 6 views
44

किसी फ़ोल्डर में सभी संगीत के लिए प्लेलिस्ट बनाने के लिए, मैं बैश में निम्न आदेश का उपयोग कर रहा हूं:बैश में तर्क के रूप में कमांड के परिणाम का उपयोग करना?

ls > list.txt 

मैं pwd (प्रिंट कार्य निर्देशिका) कमांड के परिणाम का उपयोग करना चाहता हूं प्लेलिस्ट का नाम।

कुछ ऐसा है:

ls > ${pwd}.txt 

हालांकि यह काम नहीं करता है - क्या कोई मुझे बता सकता है कि मुझे ऐसा कुछ करने के लिए किस वाक्यविन्यास का उपयोग करने की आवश्यकता है?

संपादित करें: जैसा टिप्पणियों में उल्लिखित है, pwd एक पूर्ण पथ प्रदान करेगा, इसलिए मेरी प्लेलिस्ट कुछ निर्देशिका में .txt नामित हो जाएगी - ओह! तो मुझे पथ को ट्रिम करना होगा। यह जानने के लिए धन्यवाद - शायद मैं सोचता हूं कि मेरी फाइलें कहां गईं!

उत्तर

56

उपयोग बैकटिक एक आदेश का परिणाम स्थानापन्न करने:

ls > "`pwd`.txt" 

के रूप में लंदन से कहा, $(cmd) बराबर है:

ls > "$(pwd).txt" 

ध्यान दें कि pwd की असंसाधित प्रतिस्थापन एक पूर्ण पथ है, इसलिए उपर्युक्त कमांड एक ही नाम के साथ एक ही निर्देशिका में एक ही निर्देशिका में काम करता है, लेकिन .txt एक्सटेंशन के साथ। थॉमस Kammeyer ने बताया कि basename आदेश स्ट्रिप्स आगे वाली निर्देशिका, तो यह है कि निर्देशिका के नाम के साथ वर्तमान निर्देशिका में एक पाठ फ़ाइल बना सकेगी: में रिक्त स्थान की समस्या को लाने के लिए erichui को

ls > "`basename "$(pwd)"`.txt" 

भी धन्यवाद राह।

+0

अंदर दे लेकिन ध्यान दें कि बैकटिक का उपयोग कर या $() अभी भी एक अन्य सुरक्षा कांटा होगा होगा .. पर्यावरण चर का उपयोग करना कम लागत वाली विधि है। –

+0

सच है, लेकिन प्रश्न शीर्षक और टैग सामान्यीकृत हैं, इसलिए उत्तर भी सामान्यीकृत किया जा सकता है। इस मामले में एक पर्यावरण चर "बेहतर" विकल्प है, लेकिन यह प्रश्न का सामान्य उत्तर नहीं है। –

4

वाक्य रचना है:

ls > `pwd`.txt 

' `' '~', नहीं नियमित रूप से एकल उद्धरण नीचे चरित्र निर्भर है कि।

6

सचमुच तुम क्या कहा करने के लिए, आप की कोशिश कर सकते:

ls > `pwd`.txt 

जो पूर्ण पथ नाम है, जो ठीक किया जाना चाहिए का उपयोग करेगा। ध्यान दें कि यदि आप इसे अपनी होम निर्देशिका में करते हैं, जो हो सकता है/home/hoboben में हो, तो आप उपरोक्त निर्देशिका में /home/hoboben.txt, एक टेक्स्ट फ़ाइल बनाने की कोशिश करेंगे।

क्या यह आप चाहते थे?

यदि आप चाहते हैं कि निर्देशिका के बाद नाम वाली फ़ाइल हो, तो आपको वर्तमान निर्देशिका का बेसनाम मिलेगा और उसे ptd में .txt के साथ जोड़ना होगा।

अब, pwd कमांड का उपयोग करने के बजाय ... PWD पर्यावरण चर का उपयोग क्यों नहीं करें?

उदाहरण के लिए:

ls > $PWD.txt 

या

ls > ${PWD}.txt 

संभव है कि आप अपने दूसरे उदाहरण के साथ याद करने की कोशिश कर रहे थे है।

आप में/घर/hoboben रहे हैं और आप /home/hoboben/hoboben.txt बनाने के लिए चाहते हैं, की कोशिश:

ls > ${PWD}/${PWD##*/}.txt 

आप ऐसा करते हैं, तो फ़ाइल अपने स्वयं के नाम शामिल होंगे, इसलिए अक्सर, आप इसे कुछ तरीकों से हल करेंगे। जब तक आप -ए ध्वज का उपयोग नहीं करते हैं (और उसके बाद परिणामस्वरूप फ़ाइल का नाम बदलते हैं) तब तक आप ls कमांड से इसे छिपाने के लिए फ़ाइल को स्थानांतरित कर सकते हैं या फ़ाइल को स्थानांतरित कर सकते हैं।

मैं संगीत फ़ाइलों की निर्देशिका पदानुक्रम का प्रबंधन करने के लिए अपनी स्क्रिप्ट लिखता हूं और उदाहरण के लिए, ".info" नामक उप-निर्देशिकाओं का उपयोग करता हूं, उदाहरण के लिए, कुछ अतिरिक्त फ़ाइलों में ट्रैक डेटा रखने के लिए (मूल रूप से, मैं इस तरह से मेटाडेटा को "छुपाता हूं)। यह ठीक काम करता है क्योंकि मेरी ज़रूरतें सरल हैं और मेरा संग्रह छोटा है।

1

उपर्युक्त विधि का उपयोग करके फाइलें आपकी वर्तमान निर्देशिका से एक स्तर ऊपर बनाई जाएंगी।

#!/bin/sh 

MYVAR=`pwd | sed "s|/|_|g"` 
ls > /playlistdir/$MYVAR-list.txt 
5

यह बैकटिक समाधान के बराबर है: आप सभी को प्ले-लिस्ट एक निर्देशिका करने के लिए जाना चाहते हैं, तो आप की तरह कुछ करने के लिए आवश्यकता होगी

ls > $(pwd).txt 
5

मुझे लगता है समस्या यह है कि हो सकता है निर्देशिका नामों में से एक में रिक्त स्थान हैं। उदाहरण के लिए, यदि आपकी कार्यशील निर्देशिका "/ home/user/music/कलाकार नाम" है। बैश को भ्रमित कर दिया जाएगा कि आप/home/user/music/artist और name.txt पर रीडायरेक्ट करने का प्रयास कर रहे हैं। आप

ls > "$(pwd).txt" 

इसके अलावा दोहरे उद्धरण चिह्नों के साथ इसे ठीक कर सकते हैं, तो आप करने के लिए $ (पीडब्ल्यूडी) .txt पुन: निर्देशित नहीं कर सकते हैं। उपरोक्त उदाहरण में, आप फाइल करने के लिए उत्पादन पुनः निर्देशित किया जाएगा "/ घर/उपयोगकर्ता/संगीत/कलाकार name.txt"

0

सभी पट्टी लेकिन निर्देशिका का नाम

ls >/playlistdir/${PWD##/*}.txt 

यह शायद नहीं क्या है आप क्योंकि तब आप पता नहीं कहाँ फ़ाइलें हैं (जब तक आप ls कमांड बदल)

को बदलने के लिए "/" के साथ "_"

ls >/playlistdir/${PWD//\//_}.txt 

लेकिन फिर प्लेलिस्ट बदसूरत और mayb लगेगा चाहते हैं ई चयन विंडो

में भी फिट नहीं तो यह आप दोनों एक छोटी पठनीय नाम और प्रयोग करने योग्य पथ फ़ाइल

ext=.mp3 #leave blank for all files 
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt 
संबंधित मुद्दे