mkdir -pएक निर्देशिका बनाएंगे; यह आवश्यकतानुसार अभिभावक निर्देशिका भी बनाएगा।
क्या फ़ाइलों के लिए समान कमांड मौजूद है, जो आवश्यकतानुसार एक फ़ाइल और मूल निर्देशिका बनाएगी?
mkdir -pएक निर्देशिका बनाएंगे; यह आवश्यकतानुसार अभिभावक निर्देशिका भी बनाएगा।
क्या फ़ाइलों के लिए समान कमांड मौजूद है, जो आवश्यकतानुसार एक फ़ाइल और मूल निर्देशिका बनाएगी?
जवाबों:
यदि स्रोत फ़ाइल दी गई है, तो इंस्टॉल यही करेगा /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स्रोत के रूप में केवल एक रिक्त फ़ाइल ( उदाहरण के लिए नव निर्मित ) भी दे सकते हैं ।
मैं अक्सर इस तरह की स्थिति में भाग जाता था, इसलिए मैंने बस अपनी .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'
touchp, जैसेmkdir -p
dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"
testकी जरूरत नहीं है; mkdir -pअगर डायर पहले से मौजूद है तो कुछ नहीं करता। एक त्रुटि भी वापस नहीं करता है।
मैं सुझाव देने जा रहा था क्योंकि यह इसे एक पंक्ति में रखता है, हालांकि चर को अलग से सेट करने से आप इसे बदल सकते हैं और इतिहास से कमांड को बहुत आसानी से पुनः प्राप्त कर सकते हैं।
B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"
"नकली" संभव है।
रोब ग्रिफिथ्स ने मैकवर्ल्ड डॉट कॉम पर आसानी से क्रिएट लॉट्स ऑफ न्यू फोल्डर्स शीर्षक से 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.txtdeeply/nested/foo/bar.js deeply/nested/baz/fiz.txt तक पहुंचाया जाता है xargs-I {}, इसलिए xargsप्रत्येक तर्क का अनुवाद स्वयं की आज्ञा से होगा, इसलिए अब हमारे पास है:
deeply/nested/foo/bar.txtdeeply/nested/baz/fiz.txt&&समूह 3 कमांड्स के लिए कॉम्बिनेटर का उपयोग करता है जो क्रमिक रूप से चलता है - पहली कमांड फाइल को एक पर्यावरण चर में संग्रहीत करती है (जो कि अगले फाइल पास पर फिर से उपयोग की जाती है) जिसे हमने पहले पंजीकृत किया था। है:
f=deeply/nested/foo/bar.txtf=deeply/nested/baz/fiz.txtmkdir -p, लेकिन हमें फ़ाइल नाम को काटने की आवश्यकता है। सरल का उपयोग कर पर्याप्त '${f%/*}':
mkdir -p deeply/nested/foo/mkdir -p deeply/nested/baz/fचर को फिर से संदर्भित करते हैं, जब हम touch:
touch deeply/nested/foo/bar.txttouch deeply/nested/baz/fiz.txtcat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'स्पष्टीकरण है कि अनिवार्य रूप से क्या है , जिसमें UUOC है, फिर आप xargs में जाते हैं जो शेल में वापस मिलता है, जब एक while readलूप अधिक समझ में आता है
while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt। तथ्य यह है कि आप UUOC के लिए 10 सेकंड की इंटरनेट खोज नहीं कर सकते हैं, यह भी बता रहा है