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
xargs
sh -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
cat 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 सेकंड की इंटरनेट खोज नहीं कर सकते हैं, यह भी बता रहा है