একটি নির্দিষ্ট ফাইল উপস্থিত থাকলে একটি স্বেচ্ছাচারিত বার্তা প্রদর্শন কমান্ড


11

একটি নির্দিষ্ট ফাইল উপস্থিত থাকলে "হ্যাঁ" বার্তাটি প্রদর্শন করার জন্য কোনও আদেশ রয়েছে? ফাইলটির অস্তিত্ব না থাকলে কার্যকারিতা দেওয়ার দরকার নেই।

উত্তর:


25

এই সাধারণ ব্যাশ ওয়ান-লাইনার ব্যবহার করুন:

if [ -e FILENAME ] ; then echo Yes ; fi

-eসত্যতে চেক মূল্যায়ণ যদি FILENAMEবিদ্যমান, সেটা ব্যাপার নয় কি এটা (ফাইল, ডিরেক্টরি, লিংক, ডিভাইসের, ...)।

আপনি যদি কেবল নিয়মিত ফাইলগুলি পরীক্ষা করতে চান তবে তার -fপরিবর্তে @ অ্যারোনিকাল বলেছিলেন use


18
[ -e FILENAME ] && echo Yes
জেব ম্যাককর্কল

@ জেবএমসি কর্কল সঠিক, এটিও কার্যকর। আপনি এটি পৃথক উত্তর হিসাবে পোস্ট করতে পারেন।
বাইট কমান্ডার

3
যদি FILENAMEকোনও পরিবর্তনশীল প্রসার হয় বা কোনও বিশেষ অক্ষর থাকে তবে তা উদ্ধৃত করতে ভুলবেন না। যেমন একটি স্ক্রিপ্ট [ -e "$1" ] && echo Yes,।
পিটার কর্ডেস

@PeterCordes আপনি ব্যাশ ব্যবহার করছেন আপনি ব্যবহার করতে পারেন [[এবং ]]পরিবর্তে পরিবর্তনশীল উদ্ধৃতি করুন।
ফাঁকা

1
@ হোলোয়ে: হ্যাঁ, তবে কখনও কখনও আপনাকে পোর্টেবল স্ক্রিপ্টগুলি লিখতে হয় যা কেবলমাত্র পসিক্স এসএইচ প্রয়োজন হয়। সে কারণেই আমি এটিকে ডাউনভোটিং এবং বাশ উত্তরটিকে অগ্রাহ্য করার পরিবর্তে এর একটি নিরাপদ সংস্করণ দিয়েছি। এছাড়াও মনে রাখবেন যে অভ্যন্তরের প্রসারকে উদ্ধৃত করা কোনও সমস্যা নয় [[ ]], সর্বদা উদ্ধৃতি দেওয়া শুরু করা ব্যক্তিদের পক্ষে ভাল অভ্যাস যা [[ ]]অপারেটরের অভ্যন্তরে বিশেষ নিয়মগুলি মনে রাখে না বা গাণিতিক প্রসঙ্গে।
পিটার কর্ডেস

10

আপনি এই সহজ স্ক্রিপ্ট ব্যবহার করতে পারেন:

#!/bin/bash

if [[ -f $1 ]]; then
    echo "Yes"
    exit 0
else
    exit 1
fi

এটি হিসাবে সংরক্ষণ করুন file-exists.sh। তারপরে, টার্মিনালে টাইপ করুন chmod +x file-exists.sh

এটির মতো ব্যবহার করুন: ./file-exists.sh FILEআপনি FILEযে ফাইলটি যাচাই করতে চান তা প্রতিস্থাপন করুন, উদাহরণস্বরূপ:

./file-exists.sh file.txt

যদি file.txtবিদ্যমান থাকে Yesতবে টার্মিনালে মুদ্রিত হবে এবং প্রোগ্রামটি 0 (সাফল্য) সহ প্রস্থান করবে। যদি ফাইলটি বিদ্যমান না থাকে তবে কিছুই মুদ্রিত হবে না এবং প্রোগ্রামটি স্থিতি 1 (ব্যর্থতা) সহ প্রস্থান করবে।

আপনি যদি কৌতূহলী হন তবে কেন আমি exitআদেশটি অন্তর্ভুক্ত করেছি , পড়ুন ...


exitকমান্ড দিয়ে কি হবে ?

exitস্বাভাবিক প্রক্রিয়া সমাপ্তির কারণ। এর অর্থ কী, মূলত: এটি স্ক্রিপ্টটি বন্ধ করে দেয়। এটি একটি alচ্ছিক (সংখ্যাসূচক) পরামিতি গ্রহণ করে যা স্ক্রিপ্টের প্রস্থান স্থিতি হবে called

এই প্রস্থান স্থিতিটি আপনার অন্যান্য স্ক্রিপ্টগুলি আপনার file-existsস্ক্রিপ্টটি ব্যবহার করতে সক্ষম করে এবং এটি ফাইলটি জানার তাদের উপায় বিদ্যমান বা না।

এটি ব্যবহারের জন্য রাখার একটি সাধারণ উদাহরণ হ'ল এই স্ক্রিপ্টটি (এটি সংরক্ষণ করুন file-exists-cli.sh):

#!/bin/bash

echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run `file-exists.sh` but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
    echo "$FILE exists"
else
    echo "$FILE does not exist"
fi

সাধারণ করুন chmod +x file-exists-cli.shএবং তারপরে এটি চালান : ./file-exists-cli.sh. আপনি এরকম কিছু দেখতে পাবেন:

ফাইল বিদ্যমান ( exit 0):

➜  ~ ./file-exists-cli.sh 
Enter a filename and I will tell you if it exists or not: 
booleans.py
booleans.py exists

ফাইল বিদ্যমান নেই ( exit 1):

➜  ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not: 
asdf
asdf does not exist

2
ভাল, তবে আপনি যেমন পরিবর্তনশীল উল্লেখ উদ্ধৃত করতে হবে "$1"। এটিতে যদি সাদা জায়গা থাকে তবে তা উদ্ধৃতি ছাড়াই ভেঙে যাবে এবং অন্যান্য খারাপ জিনিস ঘটতে পারে।
জো

9

কমান্ড লাইনের ব্যাশ শেলের মধ্যে।

if [[ -f /path/to/file ]]; then echo "Yes"; fi

এটি ব্যাশ শর্তসাপেক্ষ অপারেটরটি ব্যবহার করে -fএবং ফাইলটি বিদ্যমান এবং একটি নিয়মিত ফাইল কিনা তা পরীক্ষা করে দেখছে। আপনি যদি ডিরেক্টরি এবং লিঙ্কগুলি সহ যে কোনও ফাইলের পরীক্ষা করতে চান তবে ব্যবহার করুন -e

এটি ব্যাশ শর্তাবলীর জন্য একটি দুর্দান্ত উত্স।


1
ডাবল ধনুর্বন্ধনী কেন?
বাইট কমান্ডার

1
আমি testএটির আসল ফর্ম্যাটে ভক্ত নই , আমি জানি এটি অত্যধিক কিল, তবে এটি আমার অভ্যাস।
অ্যারোনিকাল

7
@ বাইটকম্যান্ডার: ডাবল ধনুর্বন্ধনী একক ধনুর্বন্ধনী তুলনায় সাধারণত ভাল। এগুলি শেল সিনট্যাক্সের একটি অংশ ( [কমান্ডটি না বলার পরিবর্তে , যা সাধারণত একটি বিল্টিন বলে।) তারা একক ব্রেস সংস্করণের অসঙ্গতি এবং বোবা আচরণগুলি সংশোধন করে। [বিল্টিনটি সামঞ্জস্যের জন্য রয়ে গেছে, তবে নতুন ব্যাশ কোডে এটি ব্যবহার করার কোনও ভাল কারণ আমি দেখতে পাচ্ছি না। (আপনার যদি পসিক্স-কমপ্লায়েন্ট স্ক্রিপ্টগুলি লেখার দরকার হয় যা প্রাচীন শেল বা অন্য কোনও কিছুতে চলতে পারে তবে এটি আলাদা))
নিক মাত্তিও

@ কুন্দর: যদিও বেশিরভাগ ক্ষেত্রেই ন্যায্য হতে সম্মত হন, " [সাধারণত একটি বিল্টিনকে কল করেন" সন্দেহজনক। type -a [আমার জন্য "শেল বিল্টিন", তারপরে "তালিকাবদ্ধ করে /usr/bin/[।"
wchargin

1
@ ওচার্জিন: আমি ভয় করছি যে আপনি কী পাচ্ছেন তা আমি বুঝতে পারি না। আপনার typeফলাফলগুলি কি বলেছিল তা সংবিধানিত বলে মনে হচ্ছে, না?
নিক মাত্তিও

5

আপনি যা চান তার জন্য সংক্ষিপ্ততম আদেশটি হ'ল:

test -e FILENAME && echo Yes

test -eপ্রদত্ত নামটি ফাইল সিস্টেমে বিদ্যমান কিনা তা পরীক্ষা করবে। (আপনি test -fকেবল নিয়মিত ফাইলগুলিতে সীমাবদ্ধ রাখতে ব্যবহার করতে পারেন man testmore আরও দেখুন ))

প্রদত্ত শর্তটি যদি সত্যকে মূল্যায়ন করে তবে testসফল প্রস্থান স্থিতি ফিরে আসে (অন্যথায় এটি একটি ব্যর্থতার স্থিতি ফিরিয়ে দেয়)। আমরা দুটি কমান্ড ব্যবহার করে একত্রিত করি &&যার অর্থ "পূর্ববর্তী কমান্ডটি সাফল্যের স্থিতি দিয়ে উপস্থিত থাকলে পরবর্তী কমান্ড কার্যকর করুন"। পরবর্তী কমান্ডটি কেবল Yesস্ট্যান্ডার্ড আউটপুটে প্রিন্ট করে; টার্মিনালে একটি ইন্টারেক্টিভ শেলের ক্ষেত্রে।

এটি একটি ifবিবৃতিতে অতিরিক্ত পাঠ্য উপাদান এড়িয়ে চলেছে , তবুও একই ফলাফল দেয়। ব্যবহার &&(বা তার বিপরীত ||) কমান্ড একসঙ্গে গিঁট ভাল কাজ করে যখন শুধুমাত্র একটি একক কমান্ডের সাথে জড়িত আছেন। আপনি যদি একক কমান্ডের প্রস্থান স্থিতির প্রতিক্রিয়া হিসাবে একটি একক কমান্ড কার্যকর করার চেয়ে আরও বেশি কিছু করতে চান তবে ifসিনট্যাক্সটি দ্রুত ব্যবহার করা আরও বেশি পঠনযোগ্য হয়ে যায়।

অন্যান্য জবাব হিসাবে ইতিমধ্যে ইঙ্গিত হিসাবে, সমতুল্য ifশৈলী নির্মাণ হবে:

if test -e FILENAME; then echo Yes; fi

বা বিকল্পভাবে:

if test -e FILENAME
then
    echo Yes
fi

এই উদ্দেশ্যে, [এবং testসমতুল্য, বাদে এটি [একটি সমাপ্তি দাবি করে ]


4

এই ধরণের প্রশ্নের চামড়ার জন্য একাধিক উপায় রয়েছে এবং এখানে আরও একটি প্রশ্ন রয়েছে: পতাকা findসহ কমান্ডটি ব্যবহার করুন -exec। ফাইলের পথে দুটি অংশে বিভক্ত করা যায় find /etcযা ডিরেক্টরি সেট করে এবং -name FILENAMEযা ফাইলের নাম নির্দিষ্ট করে (ডু!)। -maxdepthরাখা হবে findসঙ্গে কাজ /etcশুধুমাত্র ডিরেক্টরি ও সাব মধ্যে নামা করা হবে না

adminx@L455D:~$ find /etc -maxdepth 1  -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1  -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$ 

অন্য উপায়, এর মাধ্যমে stat:

adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES

এবং বিকল্পভাবে পাইথনের মাধ্যমে:

>>> import os
>>> if os.stat('/etc/passwd'): 
...    print 'YES'
... 
YES
>>> if os.stat('/etc/passwd1'): 
...    print 'YES'
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'

বা একটি শর্ট কমান্ড লাইনের বিকল্প:

 python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.