यूनिक्स - फ़ोल्डर्स और फ़ाइल का पथ बनाएं


125

मुझे पता है कि आप mkdirएक निर्देशिका बनाने के लिए और कर सकते हैंtouch एक फ़ाइल बनाने के , लेकिन क्या एक ही बार में दोनों संचालन करने का कोई तरीका नहीं है?

यानी यदि फ़ोल्डर नीचे otherमौजूद नहीं है तो मैं नीचे करना चाहता हूं :

cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

त्रुटि:

cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory

क्या कोई इसके लिए एक वर्कअराउंड के रूप में एक समारोह में आया है?



यदि यह आवश्यक है कि फ़ाइल का निर्माण और उसकी निर्देशिका परमाणु हो, तो आपको एक फ़ाइल सिस्टम लिखना होगा जो इस ऑपरेशन की पेशकश करता है। यह मानक लिनक्स फाइल सिस्टम के साथ संभव नहीं है।
पीटर जी।

@ मैं समझता हूं कि यह प्रश्न अब डेढ़ साल पुराना है, लेकिन हाल ही में कई उत्तरों को इसमें मिला दिया गया था। यदि आपको इस प्रकार की चीज़ की बहुत आवश्यकता है, तो आप मेरे उत्तर को उपयोगी मान सकते हैं । (मैं स्वीकृत उत्तर की तुलना में अधिक उपयोगी हूं, लेकिन मैं यहां पर भीख नहीं मांग रहा हूं :-))
जोनाथन रेनहार्ट


@tdammers क्यू: "मैं एक्स कैसे करूँ?" एक: "यहाँ वाई करने के लिए कैसे है"
हेनरी हेनरिंस

जवाबों:


139

&&एक शेल लाइन में दो कमांड को संयोजित करने के लिए उपयोग करें :

COMMAND1 && COMMAND2
mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt

नोट: पहले मैंने ;दो आदेशों को अलग करने के लिए उपयोग की सिफारिश की थी, लेकिन जैसा कि @trysis ने बताया है कि &&ज्यादातर स्थितियों में इसका उपयोग करना बेहतर है क्योंकि यदि COMMAND1विफल रहता है COMMAND2तो या तो निष्पादित नहीं किया जाएगा। (अन्यथा यह उन मुद्दों को जन्म दे सकता है जिनकी आप उम्मीद नहीं कर रहे थे।)


16
संभवतः उपयोग करने के लिए बेहतर है &&, जैसे कि ;, यदि पहली कमांड विफल हो जाती है, तो दूसरी कमांड अभी भी चलेगी (और विफल भी, क्योंकि वह निर्देशिका अभी तक मौजूद नहीं है)। साथ &&यदि पहले आदेश विफल रहता है, दूसरा आदेश नहीं चलता है।
ट्रंसिस

12
कोड उदाहरण के लिए एक छोटा कट हो सकता है mkdir -p /my/other/path/here && touch $_/cpredthing.txt:। $_अनिवार्य रूप से "निष्पादित अंतिम कमांड में अंतिम तर्क" का विस्तार होता है।
Sgnl

4
@ आपका जवाब यकीनन सही जवाब है। यह केवल क्लीनर नहीं है, यह कम त्रुटि वाला है।
चॉयलटन बी। हिगिनबॉटम

3
मैं वास्तव में काम करता है जैसे touchएक -pपैरामीटर लिया mkdir
बेन 174

86

आपको पहले सभी मूल निर्देशिका बनाने की आवश्यकता है।

FILE=./base/data/sounds/effects/camera_click.ogg

mkdir -p "$(dirname "$FILE")" && touch "$FILE"

यदि आप रचनात्मक प्राप्त करना चाहते हैं, तो आप एक समारोह बना सकते हैं :

mktouch() {
    if [ $# -lt 1 ]; then
        echo "Missing argument";
        return 1;
    fi

    for f in "$@"; do
        mkdir -p -- "$(dirname -- "$f")"
        touch -- "$f"
    done
}

और फिर इसे किसी अन्य कमांड की तरह उपयोग करें:

mktouch ./base/data/sounds/effects/camera_click.ogg ./some/other/file

इसका उपयोग करने के लिए बदल दिया &&- यह कैसे है?
जोनाथन रेनहार्ट

1
@ B @овиЈ हाँ । (मैं उन्हें पोस्ट करने से पहले चीजों का परीक्षण करने की कोशिश करता हूं।)
जोनाथन रेइनहार्ट

2
@JonathonReinhart क्या आप सुनिश्चित हैं कि आपने इसका परीक्षण किया है? मैंने कोशिश की supertouch "/tmp/abc/def ghi/jkl mno.txt"और यह असफल रहा। सभी आदेशों dirname, mkdirऔर toucherros दिया।
देवनुल

2
@ देवनुल जाहिर तौर पर पर्याप्त नहीं हैं। लानत है अपने रिक्त स्थान :-) फिक्स्ड।
जोनाथन रेनहार्ट

1
@JeremyIglehart मुझे यह पसंद है। mktouchयह है।
जोनाथन रेनहार्ट

24

इसे usr / usr / bin / install के साथ करें:

install -D /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

जब आपके पास स्रोत फ़ाइल न हो:

install -D <(echo 1) /my/other/path/here/cpedthing.txt

1
मुझे आश्चर्य है कि यह मणि उपकरण काफी हद तक नजरअंदाज कर दिया गया है - आदमी स्थापित - दिखाएगा कि स्थापित एक बेहतर समाधान है।
SC-SL

1
आप भी उपयोग कर सकते हैं -D /dev/null, जो मेरे लिए याद रखना आसान है।
वारबैंक

14

क्या यही मुझे करना होगा:

mkdir -p /my/other/path/here && touch $_/cpredthing.txt

यहां ही $_ एक चर है जो पिछले तर्क के अंतिम तर्क का प्रतिनिधित्व करता है जिसे हमने लाइन में निष्पादित किया था।

हमेशा की तरह यदि आप यह देखना चाहते हैं कि आउटपुट क्या हो सकता है, तो आप echoकमांड का उपयोग करके इसका परीक्षण कर सकते हैं , जैसे:

echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt

निम्नानुसार कौन सा आउटपुट:

mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt

एक बोनस के रूप में, आप एक बार ब्रेस विस्तार का उपयोग करते हुए कई फाइलें लिख सकते हैं, उदाहरण के लिए:

mkdir -p /code/temp/other/path/here &&
touch $_/{cpredthing.txt,anotherfile,somescript.sh}

फिर से, पूरी तरह से परीक्षण योग्य echo:

mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt /code/temp/other/path/here/anotherfile /code/temp/other/path/here/somescript.sh

13
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"

1
एक अनाम उपयोगकर्ता ने dirname -z "$@" | xargs -0 mkdir -pप्रदर्शन के लिए उपयोग करने के लिए (संपादन के माध्यम से) सुझाया । (
झूठ बोलना



2

जैसा कि मैंने देखा और एक यूनिक्स फोरम में परीक्षण किया है जो इस समस्या को हल करता है

ptouch() {
    for p in "$@"; do
        _dir="$(dirname -- "$p")"
        [ -d "$_dir" ] || mkdir -p -- "$_dir"
    touch -- "$p"
    done
}

1

if thenबयानों की कोई आवश्यकता नहीं है ... आप इसे एक ही पंक्ति में कर सकते हैं;

mkdir -p /my/other/path/here;cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

- या दो लाइनों पर -

mkdir -p /my/other/path/here
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

- -pयदि निर्देशिका पहले से मौजूद है (जो मैं यहां आया था :))


1

विशेष (लेकिन असामान्य नहीं) मामले में जहां आप एक ही निर्देशिका पदानुक्रम को फिर से बनाने की कोशिश कर रहे हैं, cp --parents उपयोगी हो सकता है।

उदाहरण के लिए यदि /my/longस्रोत फ़ाइलें हैं, और my/otherपहले से मौजूद है, तो आप यह कर सकते हैं:

cd /my/long
cp --parents path/here/thing.txt /my/other

-4

यदि आप केवल 1 परम स्निपेट के साथ सरल चाहते हैं:

rm -rf /abs/path/to/file;  #prevent cases when old file was a folder
mkdir -p /abs/path/to/file; #make it fist as a dir
rm -rf /abs/path/to/file; #remove the leaf of the dir preserving parents 
touch /abs/path/to/file; #create the actual file

3
यदि आप केवल पिछले कुछ घंटों के काम से छुटकारा पाना चाहते हैं, तो कुछ rm -rfआदेशों के बारे में आभार व्यक्त करें। - here यही है, घंटे , यह मानते हुए कि आप एक समझदार संस्करण नियंत्रण / बैकअप नीति का पालन करते हैं ... अन्यथा, यह अच्छी तरह से महीनों का हो सकता है।
लेफ्टनैबाउट

1
rm -rfउचित स्पष्टीकरण और चेतावनी के बिना कभी भी सुझाव नहीं दिया जाना चाहिए।
Mausy5043
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.