यदि यह मौजूद नहीं है तो एक लाइनर को एटमेटिक रूप से बैश करें


9

मैं एक बैश वन-लाइनर चाहता हूं जो परमाणु रूप से एक फाइल बनाता है अगर यह मौजूद नहीं है। इसका मतलब यह है कि "यदि फ़ाइल मौजूद नहीं है, तो इसे बनाएं" लेकिन यह सुनिश्चित करना कि कोई और फ़ाइल बनाने और फ़ाइल बनाने के बीच छोटी जगह में फ़ाइल बनाने का प्रबंधन नहीं करता है।


क्षमा करें, मैंने 'परमाणु' को 'स्वचालित रूप से' पढ़ा है। मैंने अपना उत्तर हटा दिया।
हारून

जवाबों:


6

[एसओ] के लिए विभिन्न टिप्पणियों और लिंक से जवाब चोरी । ऐसा लगता है कि POSIX अनुपालन विधि है जिसमें शामिल नहीं है mkdirजैसा कि मैंने नीचे अपने मूल उत्तर में उल्लेख किया है

set -o noclobber # or set -C
{ > file ; } &> /dev/null

यदि फ़ाइल पहले से मौजूद है, तो रिटर्न 0 या विफल होने और गैर-शून्य फाइल करने के लिए यह पुनर्निर्देशित करता है।


मूल उत्तर

आपको उपयोग करना होगा mkdir- वह परमाणु है, या तो निर्देशिका बनाई जाती है और आप जारी रख सकते हैं या यह नहीं बनाता है इसलिए आप उचित कार्रवाई करते हैं।

बेशक, mkdirएक फ़ाइल नहीं बनाता है , लेकिन एक बार जब आप जानते हैं कि आपके पास निर्देशिका तक विशेष पहुंच है, तो आप उस फ़ाइल को बना सकते हैं जिसे आप चाहते हैं।

एक लाइनर के रूप में - मैं आपको छोड़ दूंगा। व्यक्तिगत रूप से मैं इसे कुछ पंक्तियों में लिखूंगा, क्योंकि यह अधिक अनुरक्षण योग्य होगा।


लेकिन stackoverflow.com/q/13828544/1207760 से noclobber अधिक है जो ओपी चाहता है।
Law29

नोकोलबार, सामान्य तौर पर, एक अच्छा जवाब है। लेकिन यह ksh88 के लिए काम नहीं करता है।
jrw32982

1
@ जॉनीवियर्सबा लेकिन सवाल बैश के बारे में है।
Womble

@womble हां, लेकिन उत्तर में पोसिक्स का उल्लेख किया गया है, जिसका अर्थ यह हो सकता है कि कोई व्यक्ति अन्य गोले पर लागू हो। Ksh88 अभी भी कुछ सर्वरों पर मानक शेल है।
jrw32982

0

यह फ़ाइल या निर्देशिका है? यदि फ़ाइल है, तो आप साधारण कमांड टच का उपयोग कर सकते हैं - यदि फ़ाइल मौजूद है, तो यह अंतिम एक्सेस समय को संशोधित करता है। यदि फ़ाइल मौजूद नहीं है, बनाई गई है।


0

इसको आजमाओ। lnपरीक्षण और सेट सुविधा प्रदान करता है।

touch lock.$$.tmp
if ln lock.$$.tmp lock.dat 2>/dev/null
then
    echo "File is mine"
else
    echo "Test and set failed"
fi
rm -f lock.$$.tmp

0

यदि आप फ़ाइल नाम की परवाह नहीं करते हैं, तो आप इस कार्य को उपयोगिता के लिए सौंप सकते हैं, उदाहरण के लिए mktemp

Create a temporary file or directory, safely, and print its name.
TEMPLATE must contain at least 3 consecutive `X's in last component.
If TEMPLATE is not spec‐ified, use tmp.XXXXXXXXXX, and --tmpdir is 
implied.  Files are created u+rw, and directories u+rwx, minus umask
restrictions.

मंगलाचरण:

filename=$(mktemp)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.