फ़ाइलों के लिए mkdir -p


24

mkdir -pएक निर्देशिका बनाएंगे; यह आवश्यकतानुसार अभिभावक निर्देशिका भी बनाएगा।

क्या फ़ाइलों के लिए समान कमांड मौजूद है, जो आवश्यकतानुसार एक फ़ाइल और मूल निर्देशिका बनाएगी?


ऐसा नहीं है कि मुझे पता है .. लेकिन आप सिर्फ mkdir -p / path / to / make && टच / path / to / file कर सकते हैं ... जो उस नई डायरेक्टरी स्ट्रक्चर में एक खाली फाइल बना देगा, जिसे आपने जरूरत के अनुसार बनाया है।

1
के साथ गठबंधन @Kansha कि dirnameऔर basenameऔर हम केवल एक तर्क की आवश्यकता होगी; फायदा! :)

ऐ, अच्छा फोन।

जवाबों:


29

यदि स्रोत फ़ाइल दी गई है, तो इंस्टॉल यही करेगा /dev/null-Dतर्क सभी पैरेंट निर्देशिका बनाने के लिए कहते हैं:

anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c 
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c

यकीन नहीं है कि यह एक बग है या नहीं - डिवाइस फ़ाइलों के साथ इसका व्यवहार मैनपेज में उल्लेख नहीं किया गया है। आप इसे mktempस्रोत के रूप में केवल एक रिक्त फ़ाइल ( उदाहरण के लिए नव निर्मित ) भी दे सकते हैं ।


7

नहीं, यह उतना नहीं है जितना मैं जानता हूं। लेकिन आप हमेशा उपयोग कर सकते हैं mkdir -pऔर touchएक दूसरे के बाद:

f="/a/b/c.txt"
mkdir -p -- "${f%/*}" && touch -- "$f"

3

मैं अक्सर इस तरह की स्थिति में भाग जाता था, इसलिए मैंने बस अपनी .bashrcफ़ाइल में एक फ़ंक्शन लिखा । यह इस तरह दिख रहा है

function create() {
    arg=$1
    num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
    make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
    mkdir -p $make_dirs && touch $arg
}

इसलिए, जब मैं गैर-मौजूद निर्देशिका के पथ के अंदर एक फ़ाइल बनाना चाहता हूं, तो मैं कहूंगा

create what/is/it  # will create dirs 'what' and 'is', with file 'it' inside 'is'

1
मेरा आदमी! - धन्यवाद, मैंने इसे बुलाया touchp, जैसेmkdir -p
पारिस्थितिक जोग

0
dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"

3
testकी जरूरत नहीं है; mkdir -pअगर डायर पहले से मौजूद है तो कुछ नहीं करता। एक त्रुटि भी वापस नहीं करता है।
derobert

1
और हां, यह केवल निर्देशिका बनाता है।
बजे एक CVn

0

मैं सुझाव देने जा रहा था क्योंकि यह इसे एक पंक्ति में रखता है, हालांकि चर को अलग से सेट करने से आप इसे बदल सकते हैं और इतिहास से कमांड को बहुत आसानी से पुनः प्राप्त कर सकते हैं।

B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"

0

"नकली" संभव है।

सबसे पहले, कुछ आवश्यक सिद्धांत:

रोब ग्रिफिथ्स ने मैकवर्ल्ड डॉट कॉम पर आसानी से क्रिएट लॉट्स ऑफ न्यू फोल्डर्स शीर्षक से 2007 में एक लेख पोस्ट किया, जिसमें उन्होंने xargsनिर्देशिकाओं का उपयोग करने के लिए फाइलों की एक सूची में पढ़ने के लिए कमांड का उपयोग करने पर चर्चा की mkdir

xargsध्वज के साथ एक placeholder( {}) को संदर्भित करने में सक्षम है -I, जिसमें पास किए गए प्रत्येक तर्क के लिए मूल्य शामिल है xargs। यहाँ उस झंडे के साथ और इसके बिना का अंतर है:

$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt

xargssh -cध्वज के साथ मनमाना शेल कमांड चलाने में भी सक्षम है :

foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'

अवधारणाओं का मेल:

हम इन अवधारणाओं को mkdir -pइसके निर्माण के लिए @ldx के उत्तर के बजाय mkdirऔर इन अवधारणाओं के साथ जोड़ सकते हैं :

$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'

यह कमांड मूल रूप से फ़ाइलों के लाइन-अलग-अलग सूची में प्रत्येक फ़ाइलनाम को मैप करता है, फ़ाइल भाग से चॉप करता है, निर्देशिका बनाता है mkdir -pऔर फिर touchसंबंधित निर्देशिका में फ़ाइल नाम से बचता है।

यहाँ उपरोक्त आदेश में क्या होता है, का विराम दिया गया है:

उदाहरण के लिए कहो मेरी files.txtशक्ल कुछ इस तरह है:

deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
  • cat files.txt पैदा करता है deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt
  • deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt तक पहुंचाया जाता है xargs
  • क्योंकि हमने उपयोग किया था -I {}, इसलिए xargsप्रत्येक तर्क का अनुवाद स्वयं की आज्ञा से होगा, इसलिए अब हमारे पास है:
    • deeply/nested/foo/bar.txt
    • deeply/nested/baz/fiz.txt
  • फिर हम एक शेल कमांड चलाते हैं जो &&समूह 3 कमांड्स के लिए कॉम्बिनेटर का उपयोग करता है जो क्रमिक रूप से चलता है - पहली कमांड फाइल को एक पर्यावरण चर में संग्रहीत करती है (जो कि अगले फाइल पास पर फिर से उपयोग की जाती है) जिसे हमने पहले पंजीकृत किया था। है:
    • f=deeply/nested/foo/bar.txt
    • f=deeply/nested/baz/fiz.txt
  • अब हमारे पास एक चर है जिसे हम पास कर सकते हैं mkdir -p, लेकिन हमें फ़ाइल नाम को काटने की आवश्यकता है। सरल का उपयोग कर पर्याप्त '${f%/*}':
    • mkdir -p deeply/nested/foo/
    • mkdir -p deeply/nested/baz/
  • और तब हम केवल उस fचर को फिर से संदर्भित करते हैं, जब हम touch:
    • touch deeply/nested/foo/bar.txt
    • touch deeply/nested/baz/fiz.txt

2
आपके पास यह सब cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'स्पष्टीकरण है कि अनिवार्य रूप से क्या है , जिसमें UUOC है, फिर आप xargs में जाते हैं जो शेल में वापस मिलता है, जब एक while readलूप अधिक समझ में आता है
स्टीवन पेनी

1
मैं मानता हूँ कि मैं सबसे अधिक * nix कमांड पर नहीं लगा हूं - मुझे यह भी पता नहीं है कि UUOC क्या है - लेकिन मैं यह देखने में विफल हूं कि यह एक भयानक उत्तर कैसे है। यह आपके मूल प्रश्न का शोध, परीक्षण और कार्यशील समाधान है। यह रचनात्मक (आपकी बल्कि अशिष्ट टिप्पणी के विपरीत) है। कृपया, अगर आपको लगता है कि मैंने यहां कुछ गैर-जिम्मेदाराना काम किया है जो मुझे नहीं करना चाहिए, तो आगे विस्तार से बताएं - क्यों समझा । मैं किसी भी पदार्थ की राय वाली बहस के लिए ज्यादा परवाह नहीं करता।
रेजरॉर्बड

1
मेरी अंतिम टिप्पणी इसे पूरी तरह से समझाती है। आपका पूरा उत्तर बेहतर तरीके से लिखा जा सकता है while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt। तथ्य यह है कि आप UUOC के लिए 10 सेकंड की इंटरनेट खोज नहीं कर सकते हैं, यह भी बता रहा है
स्टीवन पेनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.