फ़ाइल मौजूद है या नहीं, यह जांचने के लिए सिंगल कमांड और स्टडआउट के लिए (कस्टम) संदेश प्रिंट करें?


18

आशा है कि यह नोट करना ठीक है, अब जब मैंने इसका सामना किया है:

मैं पहले से ही जानता हूं कि कमांड test( [) कमांड का उपयोग करके फाइल अस्तित्व के लिए परीक्षण कर सकता है :

$ touch exists.file
$ if [ -f exists.file ] ; then echo "yes" ; else echo "no" ; fi
yes
$ if [ -f noexists.file ] ; then echo "yes" ; else echo "no" ; fi
no

... लेकिन यह वहाँ टाइप करने का एक सा है :)तो, मैं भटक रहा था अगर वहाँ एक "डिफ़ॉल्ट" एकल कमांड है, जो फ़ाइल अस्तित्व को वापस कर देगा stdout?

मैं testबाहर निकलने की स्थिति के साथ भी उपयोग कर सकता हूं $?:

$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1

... लेकिन यह अभी भी दो आदेश हैं - और तर्क "उलटा" (सफलता के लिए 0, और विफलता के लिए नॉनज़रो) भी है।

कारण मैं पूछ रहा हूं कि मुझे फ़ाइल अस्तित्व के लिए परीक्षण करने की आवश्यकता है gnuplot, जिसके system("command")परिणामस्वरूप " स्ट्रिंग के रूप में स्टडआउट से परिणामी चरित्र धारा वापस आती है ;" में gnuplotसीधे कर सकते हैं:

gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes

इसलिए मैं मूल रूप से इस तरह (छद्म) कुछ लिखने में सक्षम होना चाहता हूं:

gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
yes

... दुर्भाग्य से, मैं उस का सीधे उपयोग नहीं कर सकता testऔर $?:

gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
no

... मुझे तर्क को उल्टा करना होगा।

इसलिए, मुझे मूल रूप से एक कस्टम स्क्रिप्ट सॉल्यूशन (या स्क्रिप्ट को इनलाइनर के रूप में लिखना) के साथ आना होगा ... और मुझे लगा, अगर पहले से ही कोई डिफॉल्ट कमांड है जो 0 या 1 प्रिंट कर सकता है (या) एक कस्टम संदेश) फ़ाइल अस्तित्व के लिए stdout करने के लिए, तो मुझे ऐसा करने की ज़रूरत नहीं है :)

(ध्यान दें कि lsएक उम्मीदवार हो सकता है, लेकिन यह stdout आउटपुट बहुत अधिक क्रिया है; और अगर मैं उससे बचना चाहता हूं, तो मुझे सभी आउटपुट को दबाना होगा और फिर से मौजूद स्थिति को वापस करना होगा, जैसे कि

$ ls exists.file 1>/dev/null 2>/dev/null ; echo $? 
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $? 
2

... लेकिन यह फिर से दो आज्ञाएँ हैं (और अधिक टाइपिंग), और "उलटा" तर्क ...)

तो, क्या एक डिफ़ॉल्ट कमांड है जो लिनक्स में ऐसा कर सकता है?


2
कैसा रहेगा ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist" ?
इरुवर

जवाबों:


9

लगता है जैसे आपको बाहर निकलने की स्थिति की आवश्यकता है, इसलिए आप ऐसा कर सकते हैं:

system("[ ! -e file ]; echo $?")

या:

system("[ -e file ]; echo $((!$?))")

(ध्यान दें कि -f के लिए है , तो फ़ाइल मौजूद है और एक नियमित रूप से फ़ाइल है )।


5

इस सिंगल बैश कमांड का उपयोग करें:

 [ -f /home/user/file_name ]

[]सफलता पर परीक्षण और रिटर्न 0 प्रदर्शन


3
यदि कोई मामला है तो कुछ भी वापस नहीं करता है - CentOS
उभयचर

1
MacOS पर बढ़िया काम करता है।
जोशुआ पिंटर

1
आप &&||[ -f /home/user/file_name ] || echo "File not present"[ -f /home/user/file_name ] && echo "File is present"
कमांडरों

1
@ charlesreid1 एक काम करता है, धन्यवाद!
मार्ता करस

1

के बारे में क्या तर्क "inverting" द्वारा:

file_exists = 1-system("test -f exists.file; echo $?")

-1

यह काम:

pwsh -c Test-Path /etc/passwd

... यदि आपके पास PowerShell स्थापित है। यह या तो स्ट्रिंग "ट्रू" लौटाता है, यदि पथ मौजूद है, या "गलत" यदि यह नहीं है। (क्या मुझे इस उत्तर के लिए "व्यंग्यात्मक रूप से अनपेक्षित" अंक मिलते हैं?)

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