বাশে একটি নিয়মিত ফাইল না থাকলে আমি কীভাবে বলব?


3259

কোনও ফাইল উপস্থিত রয়েছে কিনা তা দেখার জন্য আমি নীচের স্ক্রিপ্টটি ব্যবহার করেছি:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

যদি আমি শুধুমাত্র যদি ফাইল নেই চেক করতে চান ব্যবহার করতে সঠিক বাক্য গঠন কি না রয়েছে?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi


9
আমি যে খুব অলস ব্যক্তি সেহেতু আমি সাধারণত নিম্নলিখিত নিরীহ কাজগুলি ব্যবহার if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi;করতাম : সম্ভবত এটি ভাল যে আমি এই প্রশ্নটি পেয়েছি এবং এটি আরও সঠিক উপায়ে করতে শিখেছি। :)
আলেদারথ

5
দুল হওয়ার জন্য আপনাকে "নিয়মিত ফাইল" বলা উচিত, কারণ বেশিরভাগ ইউনিক্স / পসিক্স ডক্স সাধারণ পদ্ধতিতে ফাইল সিস্টেমের সমস্ত প্রকারের জন্য একটি "ফাইল" প্রবেশ করায় বোঝায়, উদাহরণস্বরূপ, একটি প্রতীকী লিঙ্কটি কোনও ফাইলের একটি প্রকার, যেমন নামী পাইপ , নিয়মিত ফাইল, ডিরেক্টরি, ব্লক বিশেষ, চরিত্র বিশেষ, সকেট, ইত্যাদি
কেভিনার্পে

11
@ কেভিনার্প আপনি যদি পরীক্ষা করে দেখতে চান যে কিছু আছে কিনা , ব্যবহার করুন -e
-ফ

14
নিরাপদ হতে, সবসময় সাদা ব্যবধান দিয়ে সঠিকভাবে হ্যান্ডেল ফাইলের নাম, এর ডবল কোট ব্যবহার যেমন, FILE=$1-> FILE="$1"এবং if [ -f $FILE ];->if [ -f "$FILE" ];
kevinarpe

উত্তর:


4517

পরীক্ষা কমান্ড ( [এখানে) একটি "নয়" যৌক্তিক অপারেটর যা বিস্ময়বোধক বিন্দু (অনেক অন্যান্য ভাষায় মতো) আছে। এটা চেষ্টা কর:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

207
আরও সংক্ষেপে: [! -f /tmp/foo.txt] && প্রতিধ্বনি "ফাইল পাওয়া যায় নি!"
ডেভিড উইন্টারবটম

38
"2 টির মধ্যে যদি কোনও ফাইল উপস্থিত না থাকে" এর জন্য সঠিক বাক্য গঠন খুঁজে পেতে আমি কিছুটা সংগ্রাম করেছি। নিম্নলিখিত উভয় কাজ:if [ ! \( -f "f1" -a -f "f2" \) ] ; then echo MISSING; fi if [ ! -f "f1" ] || [ ! -f "f2" ] ; then echo MISSING; fi
mivk

153
@ ডেভিডউইন্টারবটম আরও বেশি সুচিন্তিতভাবে:[ -f /tmp/foo.txt ] || echo "File not found!"
ডেভিড ডব্লিউ।

27
প্যারামিটার নিম্নলিখিত যে কোনও একটি হতে পারে:-e: Returns true value, if file exists -f: Return true value, if file exists and regular file -r: Return true value, if file exists and is readable -w: Return true value, if file exists and is writable -x: Return true value, if file exists and is executable -d: Return true value, if exists and is a directory
এসডি।

5
সেখানে ব্যবহার করে একটি অসামঞ্জস্য হয় ! -fসঙ্গে &&ব্যবহার বনাম -fসঙ্গে ||। এটি অস্থান / অস্তিত্ব চেক দ্বারা ফিরে আসা প্রস্থান কোডের সাথে করতে হবে। যদি আপনার লাইনটি সর্বদা প্রস্থান কোড 0 (এবং কখনও কখনও আপনি এই সীমাবদ্ধতাটি চান না) দিয়ে পরিষ্কারভাবে প্রস্থান করার জন্য প্রয়োজন হয় তবে দুটি পদ্ধতির বিনিময়যোগ্য নয়। বিকল্পভাবে, কেবলমাত্র একটি ifবিবৃতি ব্যবহার করুন এবং আপনাকে আপনার অস্তিত্ব / অস্তিত্ব চেকের প্রস্থান কোড সম্পর্কে আর চিন্তা করতে হবে না।
একিউম্যানাস

670

বাশ ফাইল টেস্টিং

-b filename- বিশেষ ফাইলটি ব্লক করুন
-c filename- বিশেষ অক্ষর ফাইল
-d directoryname- ডিরেক্টরি অস্তিত্বের জন্য পরীক্ষা করুন -
-e filenameটাইপ (নোড, ডিরেক্টরি, সকেট, ইত্যাদি) নির্বিশেষে
-f filenameফাইল অস্তিত্বের জন্য পরীক্ষা করুন - নিয়মিত ফাইল অস্তিত্বের জন্য ডিরেক্টরি
-G filenameযাচাই করে দেখুন - ফাইলটি বিদ্যমান আছে এবং তার মালিকানাধীন কিনা তা পরীক্ষা করুন কার্যকর গ্রুপ আইডি
-G filename set-group-id- যদি ফাইল বিদ্যমান থাকে এবং সেট-গ্রুপ-আইডি সেট থাকে তবে এটি সত্য
-k filename- স্টিকি বিট
-L filename- সিম্বলিক লিঙ্ক
-O filename- ফাইল উপস্থিত থাকলে এবং কার্যকর ব্যবহারকারী আইডির মালিকানাধীন
-r filename- ফাইলটি পাঠযোগ্য
-S filenameকিনা তা
-s filenameপরীক্ষা করুন - ফাইল সকেট কিনা তা পরীক্ষা করুন - পরীক্ষা করুন কিনা ফাইলটি ননজারো আকারের
-u filename- ফাইল সেট-ব্যবহারকারী-আইডি বিট সেট আছে
-w filenameকিনা তা
-x filenameপরীক্ষা করুন - ফাইলটি লিখিতযোগ্য কিনা তা পরীক্ষা করুন - ফাইলটি কার্যকর হয় কিনা তা পরীক্ষা করুন

ব্যবহারবিধি:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

অপারেটরটি ব্যবহার করে একটি পরীক্ষা এক্সপ্রেশন অবহেলা করা যায়!

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi 

1
@ 0x90 আপনি যদি চান তবে আপনি আমার পোস্টটি সম্পাদনা করতে এবং এটিকে তালিকায় যুক্ত করতে মুক্ত হন। আমার ধারণা আপনার অর্থ: -n String- স্ট্রিংয়ের দৈর্ঘ্য শূন্য নয় কিনা তা পরীক্ষা করে দেখুন। বা এর অর্থ কি file1 -nt file2- যদি ফাইল 1 নতুন হয় তবে পরীক্ষা করুন ফাইল 2 (আপনি বয়স্কদের জন্য -ও ব্যবহার করতে পারেন)
ব্লু ক্যাক্টি

1
আমাদের সম্পর্কে -n: The unary operator -z tests for a null string, while -n or no operator at all returns True if a string is not empty.~ ibm.com/developerworks/library/l-bash-test/index.html
BlueCacti

1
কেন কিছু ফাংশন যেমন ফাংশন যুক্ত করে না () {⏎ যদি [-e "$ 1"] থাকে; তারপরে "$ 1 বিদ্যমান" প্রতিধ্বনি "অন্য প্রতিধ্বনি" $ 1 উপস্থিত নেই "ফাই"
এমজেড এ

291

আপনি "!" দিয়ে একটি অভিব্যক্তিটিকে অস্বীকার করতে পারেন:

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

প্রাসঙ্গিক মানুষ পাতা man testবা এবং, equivalently, man [- অথবা help testঅথবা help [জন্য বিল্ট ইন ব্যাশ কমান্ড।


4
বাশ ইন , [একটি অন্তর্নির্মিত। তাই প্রাসঙ্গিক তথ্য বরং দ্বারা প্রাপ্ত হয় help [... কিন্তু এ থেকে জানা যায় [জন্য একটি প্রতিশব্দ হয় testbuiltin, অত প্রাসঙ্গিক তথ্য বরং দ্বারা প্রাপ্ত হয় help testম্যানুয়ালটিতে বাশ শর্তসাপেক্ষ এক্সপ্রেশন বিভাগটি দেখুন ।
gniourf_gniourf

@gniourf_gniourf: হ্যাঁ, তবে ব্যাশ অন্তর্নির্মিত [কমান্ডটি বাহ্যিক [কমান্ডের সাথে খুব একইভাবে আচরণ করে , তাই হয় man testবা man [এটি কীভাবে কাজ করে সে সম্পর্কে আপনাকে একটি ভাল ধারণা দেবে।
কিথ থমসন

8
ছাড়া @KeithThompson যে ব্যাশ builtin [আরো সুইচ চেয়ে বাইরের কমান্ড রয়েছে [আমার সিস্টেম পাওয়া ... সাধারণভাবে বলতে গেলে আমি বিশ্বাস করি একটি প্রদত্ত সরঞ্জামে ডকুমেন্টেশন নির্দিষ্ট, এবং অন্য অস্পষ্টভাবে সংশ্লিষ্ট এক ডকুমেন্টেশন নির্দিষ্ট পড়তে ভালো। যদিও আমি ভুল হতে পারি;)
gniourf_gniourf

134
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

এছাড়াও, এটি সম্ভব যে ফাইলটি একটি ভাঙা প্রতীকী লিঙ্ক, বা একটি অ-নিয়মিত ফাইল, যেমন সকেট, ডিভাইস বা ফিফো। উদাহরণস্বরূপ, ভাঙা প্রতিলিঙ্কগুলির জন্য একটি চেক যোগ করতে:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi

9
আমি জিজ্ঞাসা করতে পারি কেন "" "পরীক্ষায় কেন? (যেমন [[! -a a ফাইল]])। আমি একটি সোলারিস বাক্সে উল্লিখিত সমস্ত অপশন চেষ্টা করেছিলাম এবং কেবল এটিই কাজ করেছিল, তাই কৃতজ্ঞ, তবে কেন?
দিমিত্রিওস মিস্ট্রিওটিস

30
ডাবল বন্ধনী একটি "আধুনিক" এক্সটেনশন; উদাহরণস্বরূপ তারা শব্দ বিভাজন করবে না (যেমন স্পেসগুলির সাথে ফাইলের নাম হিসাবে) এবং খালি স্ট্রিংয়ের জন্য এখনও কাজ করবে: mywiki.wooledge.org/BashFAQ/031
bw1024

7
tldp.org/LDP/abs/html/fto.html অনুসারে -a -e থেকে কার্যকর। এটি "অবচয় করা হয়েছে" এবং এর ব্যবহারকে নিরুৎসাহিত করা হয়েছে। যে
কোনওভাবে

4
@ ডিমিট্রিমিস্ট্রিওটিস দুইটি "[" একটি নন-পোর্টেবল এক্সটেনশন যা zsh & bash দ্বারা প্রয়োগ করা হয়েছে (আলাদাভাবে); যদি সম্ভব হয় তবে সাধারণত আপনার এড়ানো উচিত।
ভাল ব্যক্তি

7
আমি এটি ব্যবহার করেছি এই কারণে ভোট দিয়েছেন [[। এটি একটি বহুল ব্যবহৃত এক্সটেনশন। আপনি যদি জানেন যে আপনি ব্যাশ ব্যবহার করছেন তবে এটি ব্যবহার না করার কোনও কারণ নেই। এটি [এর তুলনায় অনেক কম ত্রুটিযুক্ত।
মাইকেল পটার 16

101

এটি উল্লেখযোগ্য যে আপনার যদি একটি একক কমান্ড কার্যকর করতে হয় তবে আপনি সংক্ষিপ্ত করতে পারেন

if [ ! -f "$file" ]; then
    echo "$file"
fi

প্রতি

test -f "$file" || echo "$file"

অথবা

[ -f "$file" ] || echo "$file"

ধন্যবাদ! এমন বিকল্পের প্রয়োজন যা [[]] ব্যবহার করে না
জোনাথন

69

আমি পসিক্স শেল সামঞ্জস্যপূর্ণ ফর্ম্যাটে নিম্নলিখিত ওয়ান-লাইনারটি করতে পছন্দ করি :

$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"

$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

বেশ কয়েকটি কমান্ডের জন্য, যেমন আমি কোনও স্ক্রিপ্টে করি:

$  [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

একবার আমি এটি করা শুরু করলে আমি খুব কমই পুরোপুরি টাইপ করা সিনট্যাক্সটি আর ব্যবহার করি না !!


1
প্রথমত, অব্যক্ত ভেরিয়েবলের উল্লেখগুলি ত্রুটি-প্রবণ। তাই বলা হয়, যেখানে এটা বলা আছে কোন ব্যাশ র manpage যে [বা testবিল্ট ইন জন্য পরীক্ষা হবে ফাইল অস্তিত্ব (যেমন বিরোধিতা ডিফল্টরূপে যুক্তির -e)? এটা কি অস্পষ্ট হবে না? আফাইক (এবং এআইইউআই বিভাগ "শর্তসাপেক্ষ এক্সপ্রেসনস") কেবলমাত্র আপনার পদ্ধতির সাথে যা পরীক্ষা করা হয় তা হল যুক্তিটি খালি (বা অপরিজ্ঞাত) নয়, যা এই ক্ষেত্রে একটি টাউটোলজি (যাক $DIR = ''এবং $FILE = '', তারপর যুক্তিটি এখনও রয়েছে) '//')।
পয়েন্টড ইয়ার্স

1
প্রুফ:, ls /fooফলাফল ls: cannot access /foo: No such file or directory[ /foo ] && echo 42, ফলাফল 42। জিএনইউ বাশ, সংস্করণ 4.2.37 (1) -রেলিজ (আই 486-পিসি-লিনাক্স-গনু)।
পয়েন্টেড ইয়ার্স

@ প্রস্তাবিতরা: আমি -fবিকল্পটি নির্দিষ্ট করতে ব্যর্থ হয়েছি , এই মুহুর্তে আমি এই উত্তরটি লিখেছি। স্পষ্টতই আপনি সর্বদা ব্যবহার করতে পারেন -e, যদি আপনার নিশ্চিত না হন তবে এটি নিয়মিত ফাইল হবে। অতিরিক্তভাবে আমার সমস্ত স্ক্রিপ্টগুলিতে আমি এই নির্মাণগুলি উদ্ধৃত করেছিলাম, পর্যাপ্ত প্রমাণ ছাড়াই আমার অবশ্যই এটি জমা দেওয়া উচিত।
জেএম বেকার

সেটি হল ACK। তবে আপনি সম্ভবত জানেন যে ওয়ান-লাইনার যদি-অন্য সমস্যাটি সমাধান করতে পারে না: [ $condition ] && if_true || if_falseত্রুটিযুক্ত one যে কোনও ইভেন্টে, আমি [ ! -f "$file" ] && if_not_existsপড়ার চেয়ে বোঝার চেয়ে সহজ মনে করি [ -f "$file" ] || if_not_exists
পয়েন্টেড ইয়ার্স

55

ফাইল অস্তিত্ব পরীক্ষা করতে, প্যারামিটার নিম্নলিখিত যে কোনও একটি হতে পারে:

-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink

নীচের সমস্ত পরীক্ষাগুলি নিয়মিত ফাইল, ডিরেক্টরি এবং সিমলিংকের ক্ষেত্রে প্রয়োগ করে:

-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0

উদাহরণ লিপি:

#!/bin/bash
FILE=$1

if [ -f "$FILE" ]; then
   echo "File $FILE exists"
else
   echo "File $FILE does not exist"
fi

39

তুমি এটি করতে পারো:

[[ ! -f "$FILE" ]] && echo "File doesn't exist"

অথবা

if [[ ! -f "$FILE" ]]; then
    echo "File doesn't exist"
fi

যদি আপনি উভয় ফাইল এবং ফোল্ডার পরীক্ষা করতে চান তবে তার -eপরিবর্তে বিকল্পটি ব্যবহার করুন -f-eনিয়মিত ফাইল, ডিরেক্টরি, সকেট, অক্ষর বিশেষ ফাইল, ব্লক বিশেষ ফাইল ইত্যাদির ক্ষেত্রে সত্য ফিরে আসে


1
এটি বাশ-নির্দিষ্ট নয়। সিনট্যাক্সটি কর্ন শেল থেকে আসে এবং এটি zsh এবং ব্যাশে উপলব্ধ। [যদিও এটি এখানে স্ট্যান্ডার্ড ইউটিলিটির তুলনায় সীমিত সুবিধা রয়েছে ।
স্টিফেন চেজেলাস

নিয়মিত ফাইল (যেমন পরীক্ষা করা হয়েছে -f) এবং ডিরেক্টরিগুলি হ'ল বিভিন্ন ধরণের ফাইলের মধ্যে মাত্র দুটি । এছাড়াও সকেট, সিমলিংক, ডিভাইস, ফিফোস, দরজা রয়েছে ... সিমলিংক রেজোলিউশনের পরে [ -eফাইল অস্তিত্বের জন্য (নিয়মিত, ফিফো, ডিরেক্টরি সহ যে কোনও ধরণের ...) পরীক্ষা করা হবে
স্টিফেন চেজেলাস

@ স্টাফেনচাজেলাস: আমি কোথাও কোনও ksh বা zsh ট্যাগ দেখছি না। আমরা বাশ বা এমন কিছু সম্পর্কে কথা বলছি যা বেশিরভাগ ইউনিক্স সিস্টেমে মানকযুক্ত। সুতরাং, প্রসঙ্গের মধ্যে, এটি বাশ নির্দিষ্ট। ওপিকে সেখানে যতগুলি শেল রয়েছে তা জানা দরকার নেই: ডি
জাহিদ

এটি ছিল আপনার উত্তরের "বাশ নির্দিষ্ট" অংশের একটি মন্তব্য ।
স্টিফেন চেজেলাস

@ স্টাফেনচাজেলাস: হ্যাঁ, এবং প্রসঙ্গে (বাশ এবং মানক শ) এটি বাশ নির্দিষ্ট। আমি আপনার দ্বিতীয় মন্তব্যে বিন্দুটি দেখতে পাচ্ছি না, এটি সম্পূর্ণ প্রসঙ্গে context ওপি দরকার নেই -e, তার দরকার আছে -f
জাহিদ

35

testঅব্যক্ত ভেরিয়েবলের জন্য দৌড়াতে আপনার সতর্ক হওয়া উচিত , কারণ এটি অপ্রত্যাশিত ফলাফল আনতে পারে:

$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1

সুপারিশটি সাধারণত পরীক্ষিত ভেরিয়েবলটি ডাবল কোটেশন চিহ্ন দ্বারা বেষ্টিত থাকে:

#!/bin/sh
FILE=$1

if [ ! -f "$FILE" ]
then
   echo "File $FILE does not exist."
fi

8
প্রস্তাবটি হ'ল প্রতিটি পরিবর্তনশীল দ্বিগুণ উদ্ধৃতি চিহ্ন দ্বারা বেষ্টিত থাকে, আপনি যদি না জানেন যে আপনার বিরল ক্ষেত্রে এটি অপ্রয়োজনীয়, বা এমন বিরল ক্ষেত্রে যেখানে এটি ক্ষতিকারক একটি। (এবং না, এটি তাদের মধ্যে একটিও নয়))
উয়েউ

ডাবল উদ্ধৃতি চিহ্ন ব্যবহার করার ক্ষেত্রে কেন এমনটি ঘটছে না তা বিশদ দেওয়ার দিকে খেয়াল করবেন? অন্যথায় মন্তব্যটিতে দরকারীতাটি দেখছি না।
আর্টডানিল

4
আমি বোঝাতে চেয়েছিলাম: এটি অপ্রয়োজনীয় বা ক্ষতিকারক বিরল ক্ষেত্রে এর একটি নয়। একটি শেল প্রোগ্রামার ডাবল উদ্ধৃতিতে প্রতিটি ভেরিয়েবল (প্রায়) সংযুক্ত করতে ব্যবহার করা উচিত; এই নিয়ম সীমাবদ্ধ নয় [ ... ]
উয়েউ


24

এটি করার জন্য তিনটি স্বতন্ত্র উপায় রয়েছে:

  1. বাশ দিয়ে প্রস্থান স্থিতি নিয়ে আলোচনা করুন (অন্য কোনও উত্তর এটি বলে নি):

    if ! [ -e "$file" ]; then
        echo "file does not exist"
    fi

    বা:

    ! [ -e "$file" ] && echo "file does not exist"
  2. পরীক্ষার কমান্ডের অভ্যন্তরে পরীক্ষাটি করুন [(সর্বাধিক উত্তর উপস্থাপনের আগে এটিই ছিল):

    if [ ! -e "$file" ]; then
        echo "file does not exist"
    fi

    বা:

    [ ! -e "$file" ] && echo "file does not exist"
  3. পরীক্ষার ফলাফল নেতিবাচক হওয়ার ||পরিবর্তে ( পরিবর্তে) কাজ করুন&& ) কাজ করুন:

    কেবল:

    [ -e "$file" ] || echo "file does not exist"

    এটি মূর্খ দেখাচ্ছে (আইএমও), আপনার কোডটি বোর্ন শেলটিতে (যেমন /bin/shসোলারিস 10 বা তার আগেরটির মতো ) পাইপলাইন নেগেশন অপারেটরের অভাবের ( !) এর অভাবে পোর্টেবল না হয়ে থাকে তা ব্যবহার করবেন না :

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi

মধ্যে কোন বহনযোগ্যতা পার্থক্য ! [এবং [ !?
হিমশীতল শিখা

3
! [ শেল পাইপলাইনগুলি 2.9.2 (যে কোন কমান্ড) এর জন্য POSIX হয় Otherwise, the exit status shall be the logical NOT of the exit status of the last command এবং [ ! পরীক্ষার জন্য POSIX হয় ! expression True if expression is false. False if expression is true. সুতরাং, উভয় POSIX হয়, এবং আমার অভিজ্ঞতা উভয় ব্যাপকভাবে সমর্থিত।

1
@ ফ্রোজেনফ্লেমে, বোর্ন শেলটিতে মূল !শব্দটি নেই যা কর্ন শেল দ্বারা প্রবর্তিত হয়েছিল। সোলারিস 10 এবং তার চেয়ে বেশি বয়সী ব্যতীত, আপনি আজকাল যদিও বোর্ন শেল পেরিয়ে আসার সম্ভাবনা কম।
স্টিফেন চেজেলাস

22

ভিতরে

[ -f "$file" ]

[কমান্ড একটি করে stat()(না lstat()পথে সঞ্চিত দিকে) সিস্টেম কল $fileএবং আয় সত্য যে সিস্টেম কল সফল এবং ফাইল টাইপ হিসাবে দ্বারা ফিরে stat()"হয় নিয়মিত ।"

সুতরাং যদি [ -f "$file" ]সত্যটি ফিরে আসে, আপনি ফাইলটি উপস্থিত থাকতে পারেন এবং একটি নিয়মিত ফাইল বা একটি সিএমলিংক হ'ল অবশেষে একটি নিয়মিত ফাইলের সমাধান করা (বা কমপক্ষে এটি সেই সময়ে ছিল stat())।

তবে যদি তা ফেরৎ মিথ্যা (বা যদি [ ! -f "$file" ]বা ! [ -f "$file" ]সত্য ফিরে), বিভিন্ন সম্ভাবনার আছে:

  • ফাইলটি নেই
  • ফাইলটি বিদ্যমান তবে একটি নিয়মিত ফাইল নয় (কোনও ডিভাইস, ফিফো, ডিরেক্টরি, সকেট হতে পারে ...)
  • ফাইলটি বিদ্যমান তবে আপনার প্যারেন্ট ডিরেক্টরিতে অনুসন্ধানের অনুমতি নেই
  • ফাইলটি বিদ্যমান তবে এটি অ্যাক্সেস করার পথটি দীর্ঘ
  • ফাইলটি একটি নিয়মিত ফাইলের একটি সিমিলিংক, তবে সিমলিংকের রেজোলিউশনের সাথে জড়িত কয়েকটি ডিরেক্টরিতে আপনার অনুসন্ধানের অনুমতি নেই।
  • ... অন্য কোন কারণে stat() সিস্টেম কল ব্যর্থ হতে পারে।

সংক্ষেপে, এটি হওয়া উচিত:

if [ -f "$file" ]; then
  printf '"%s" is a path to a regular file or symlink to regular file\n' "$file"
elif [ -e "$file" ]; then
  printf '"%s" exists but is not a regular file\n' "$file"
elif [ -L "$file" ]; then
  printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file"
else
  printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file"
fi

ফাইলটির অস্তিত্ব নেই কিনা তা জানতে, আমাদের stat()একটি ত্রুটি কোড দিয়ে কোড কলটি ফিরে আসতে হবে ENOENT(ENOTDIR আমাদেরকে বলে যে একটি পথের উপাদান একটি ডিরেক্টরি নয় অন্য কোনও ক্ষেত্রে যেখানে আমরা ফাইলটি বলতে পারি না যে পথ দ্বারা অস্তিত্ব)। দুর্ভাগ্যক্রমে [কমান্ড আমাদের এটি জানতে দেয় না। এটি ত্রুটি কোড ENOENT, EACCESS (অনুমতি অস্বীকৃত), ENAMETOOLONG বা অন্য যে কোনও কিছু হোক না কেন এটি মিথ্যা প্রত্যাবর্তন করবে।

[ -e "$file" ]পরীক্ষা সাথেও কাজ করা যেতে পারে ls -Ld -- "$file" > /dev/null। সেক্ষেত্রে, lsআপনাকে বলতে হবে কেন stat(), ব্যর্থ যদিও তথ্য সহজে প্রোগ্রামেটিক্যালি ব্যবহার করা যাবে না:

$ file=/var/spool/cron/crontabs/root
$ if [ ! -e "$file" ]; then echo does not exist; fi
does not exist
$ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi
ls: cannot access '/var/spool/cron/crontabs/root': Permission denied
stat failed

কমপক্ষে lsআমাকে বলুন যে ফাইলটি বিদ্যমান না হওয়ায় এটি ব্যর্থ হয়। কারণ ফাইলটি বিদ্যমান আছে কি নেই তা এটি বলতে পারে না। দ্য[কমান্ড শুধু সমস্যা উপেক্ষা করেছেন।

সঙ্গে zshশেল আপনার সাথে ত্রুটি কোড খোঁজ করতে পারেন $ERRNOব্যর্থ হয়ে বিশেষ পরিবর্তনশীল [কমান্ড, এবং ডিকোড যে ব্যবহার সংখ্যা $errnosবিশেষ অ্যারের zsh/systemমডিউল:

zmodload zsh/system
ERRNO=0
if [ ! -f "$file" ]; then
  err=$ERRNO
  case $errnos[err] in
    ("") echo exists, not a regular file;;
    (ENOENT|ENOTDIR)
       if [ -L "$file" ]; then
         echo broken link
       else
         echo does not exist
       fi;;
    (*) syserror -p "can't tell: " "$err"
  esac
fi

(সতর্কতা অবলম্বন করুন যখন সাম্প্রতিক সংস্করণগুলির সাথে নির্মিত তখন $errnosকয়েকটি সংস্করণ দিয়ে সমর্থনটি ভেঙে দেওয়া zshহয়েছিলgcc )।


11

একটি পরীক্ষার বিপরীতে, "!" ব্যবহার করুন। এটি অন্যান্য ভাষায় "নয়" লজিক্যাল অপারেটরের সমতুল্য। এটা চেষ্টা কর:

if [ ! -f /tmp/foo.txt ];
then
    echo "File not found!"
fi

অথবা কিছুটা ভিন্নভাবে লেখা:

if [ ! -f /tmp/foo.txt ]
    then echo "File not found!"
fi

অথবা আপনি ব্যবহার করতে পারেন:

if ! [ -f /tmp/foo.txt ]
    then echo "File not found!"
fi

বা, সমস্ত একসাথে প্রেসিং:

if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi

যা লিখিত হতে পারে (তখন "এবং" অপারেটর: এবং&) ব্যবহার করে:

[ ! -f /tmp/foo.txt ] && echo "File not found!"

যা দেখতে এর চেয়ে খাটো লাগে:

[ -f /tmp/foo.txt ] || echo "File not found!"


10

এই কোডটিও কাজ করছে।

#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
 echo "File '$FILE' Exists"
else
 echo "The File '$FILE' Does Not Exist"
fi

7

সহজ উপায়

FILE=$1
[ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"

6

এই শেল স্ক্রিপ্ট ডিরেক্টরিতে একটি ফাইল সন্ধানের জন্যও কাজ করে:

echo "enter file"

read -r a

if [ -s /home/trainee02/"$a" ]
then
    echo "yes. file is there."
else
    echo "sorry. file is not there."
fi

3
এটি পরিষ্কার নয় যে এটি অন্যান্য উত্তরগুলি ইতিমধ্যে দেয় নি এমন কিছু যুক্ত করে। এটি হার্ড-কোড করে একটি প্যাথনাম। প্রশ্নটি বাশকে ট্যাগ করা read -p "Enter file name: " -r aহওয়ায় এটি পড়ার পাশাপাশি প্রম্পটেও ব্যবহার করতে পারে । এটি ভেরিয়েবলের চারপাশে উদ্ধৃতি ব্যবহার করে; এটা ভাল, কিন্তু ব্যাখ্যা করা উচিত। এটি ফাইলটির নাম প্রতিধ্বনিত হলে এটি আরও ভাল হতে পারে। এবং এটি পরীক্ষা করে যে ফাইলটি বিদ্যমান এবং খালি নয় (এটি এর অর্থ -s) যদিও প্রশ্নটি কোনও ফাইল সম্পর্কে খালি খালি বা না সম্পর্কে জিজ্ঞাসা করে (যার -fজন্য আরও উপযুক্ত)।
জোনাথন লেফলার 21

4

কখনও কখনও এটি && এবং || ব্যবহার করা সহজ হতে পারে অপারেটর।

লাইক ইন (আপনার যদি "পরীক্ষা" কমান্ড থাকে):

test -b $FILE && echo File not there!

অথবা

test -b $FILE || echo File there!

2

আপনি যদি এর testপরিবর্তে ব্যবহার করতে চান [], তবে আপনি !অস্বীকার পেতে ব্যবহার করতে পারেন :

if ! test "$FILE"; then
  echo "does not exist"
fi

0

আপনি এক লাইনে একাধিক কমান্ডও গ্রুপ করতে পারেন

[ -f "filename" ] || ( echo test1 && echo test2 && echo test3 )

অথবা

[ -f "filename" ] || { echo test1 && echo test2 && echo test3 ;}

যদি ফাইলের নামটি প্রস্থান না করে তবে আউটপুট হবে

test1
test2
test3

দ্রষ্টব্য: (...) একটি সাব-শেলের মধ্যে চলে, একই শেলের মধ্যে {...;} রান করে। কোঁকড়া বন্ধনী স্বরলিপিটি কেবল ব্যাশে কাজ করে।


1
না, কোঁকড়ানো বন্ধনী চিহ্নিতকরণ কেবলমাত্র বাশ নয় ; এটি কোনও পসিক্স-কমপ্লায়েন্ট শেলটিতে কাজ করে।
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.