শেল স্ক্রিপ্টে কোনও ফাইল উপস্থিত রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন


175

আমি একটি শেল স্ক্রিপ্ট লিখতে চাই যা পরীক্ষা করে থাকে যে কোনও নির্দিষ্ট ফাইল archived_sensor_data.json, উপস্থিত রয়েছে এবং যদি তা থাকে, তবে এটি মুছে ফেলা হয়। Http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html অনুসরণ করে , আমি নিম্নলিখিতগুলি চেষ্টা করেছি:

[-e archived_sensor_data.json] && rm archived_sensor_data.json

তবে এটি একটি ত্রুটি ছুড়ে ফেলে

[-e: command not found

যখন আমি কমান্ডটি test_controllerব্যবহার করে ফলাফল স্ক্রিপ্টটি চালানোর চেষ্টা করি ./test_controller। কোডটিতে কী ভুল?



2
স্কোয়ার ব্র্যাকেট খোলার মধ্যে "[" এবং বিকল্প "-e" ফাইলের নাম এবং
ক্লোয়ার

উত্তর:


350

আপনি বন্ধনী এবং এর মধ্যে একটি প্রয়োজনীয় স্থান মিস করছেন -e:

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi

12
পরিশেষে আমি দুই ফাঁকা স্পেস, উদ্বোধনী বর্গাকার বন্ধনী পর এক এবং বন্ধ এক আগে এক যোগ করেছেন: [ -e archived_sensor_data.json ] && rm archived_sensor_data.json। স্ক্রিপ্টটি এখন কাজ করছে বলে মনে হচ্ছে।
কুর্ট পিক

3
এটি if [ -e "$1" ](ফাইলের নাম ইনপুট আর্গুমেন্ট) ব্যবহার করেও কাজ করে ।
এডওয়ার্ড

2
এখানে মূল পার্থক্যটি হ'ল আপনি "শেল" স্ক্রিপ্টিংয়ের পরিবর্তে "বাশ" স্ক্রিপ্টিং ব্যবহার করছেন। লক্ষ্য করুন যে আপনি যুক্ত করেছেন প্রথম লাইনটি ছিল #! / Bin / bash, সুতরাং আপনি মেশিনকে sh এর পরিবর্তে "বাশ" ব্যবহার করতে বলছেন। কারণ sh এই যুক্তি "-e" স্বীকৃতি দেয় না
নিক কিউভাস

29

এখানে একটি বিকল্প পদ্ধতি ব্যবহার করে ls:

(ls x.txt && echo yes) || echo no

আপনার কাছ থেকে কোনো আউটপুট লুকাতে চান lsযাতে আপনি শুধু হ্যাঁ অথবা না দেখে, পুনর্নির্দেশ stdoutএবং stderrকরতে /dev/null:

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no

1
এই কোডটির অর্থ: "যদি lsসফল হয় তবে এই জাতীয় ফাইল রয়েছে, অন্যথায়, কিছুই নেই"। যদি lsব্যর্থ হয় তবে এর অর্থ এই নয় যে ফাইলটি অনুপস্থিত। এটি অন্য কোনও ত্রুটি হতে পারে। উদাহরণস্বরূপ, রুটের মালিকানাধীন ডিরেক্টরিতে ফাইল তৈরি করুন এবং lsনিয়মিত ব্যবহারকারীর অধীনে করার চেষ্টা করুন। এটি এতে ব্যর্থ হবে Permission deniedযা সমতুল্য নয় যে ফাইলটি বিদ্যমান নেই।
টিগ্রান

9

আমার সমাধানের সুপারিশের পটভূমি হ'ল এক বন্ধুর গল্প, যিনি তার প্রথম কাজের দ্বিতীয় সপ্তাহের মধ্যে, অর্ধ বিল্ড-সার্ভার পরিষ্কার করেছিলেন। সুতরাং মূল কাজটি হ'ল কোনও ফাইল উপস্থিত রয়েছে কিনা তা নির্ধারণ করা এবং যদি তা হয় তবে আসুন এটি মুছুন। তবে এই নদীতে কয়েকটি বিশ্বাসঘাতক র‌্যাপিড রয়েছে:

  • সবকিছুই একটি ফাইল।

  • স্ক্রিপ্টগুলির আসল ক্ষমতা কেবল যদি তারা সাধারণ কাজগুলি সমাধান করে

  • সাধারণ হতে, আমরা ভেরিয়েবল ব্যবহার করি

  • ম্যানুয়াল হস্তক্ষেপ এড়াতে আমরা প্রায়শই স্ক্রিপ্টগুলিতে শক্তি প্রয়োগ করি

  • এবং ভালবাসা-র পুনরুত্পাদনকারীকে আমরা নিশ্চিত করি যে আমরা সময় মতো ফ্যাশনে তৈরি করি, অনুলিপি করি এবং ধ্বংস করি।

নিম্নলিখিত পরিস্থিতিতে বিবেচনা করুন:

আমাদের মুছে ফেলার ফাইলটি রয়েছে: filesexists.json

এই ফাইলের নামটি একটি ভেরিয়েবলে সংরক্ষণ করা হয়

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

জিনিসগুলিকে সত্যিই নমনীয় করে তোলার জন্য আমরা একটি পথের পরিবর্তনশীলও আছি va

<host>:~/Documents/thisfolderexists pathtofile=".."

<host>:~/Documents/thisfolderexists ls $pathtofile

filesexists.json  history20170728  SE-Data-API.pem  thisfolderexists

সুতরাং আসুন দেখা যাক -eএটি করার কথা বলে কি না। ফাইলগুলি কি বিদ্যমান?

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

এটা করে. ম্যাজিক।

যাইহোক, যদি ফাইল ভেরিয়েবলটি দুর্ঘটনাক্রমে নফিনে মূল্যায়ন করা হয় তবে কি হবে?

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

কি? এটি একটি ত্রুটি নিয়ে ফিরে আসার কথা ... এবং কীভাবে পুরো ফোল্ডারটি দুর্ঘটনাক্রমে মুছে ফেলা হয়েছে তা গল্পের শুরু

একটি বিকল্প হতে পারে আমরা একটি 'ফাইল' হতে যা বুঝি তার জন্য বিশেষভাবে পরীক্ষা করা

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

0

সুতরাং ফাইল উপস্থিত ...

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

1

সুতরাং এটি কোনও ফাইল নয় এবং সম্ভবত, আমরা পুরো ডিরেক্টরিটি মুছতে চাই না

man test নিম্নলিখিত বলতে আছে:

-b FILE

       FILE exists and is block special

-c FILE

       FILE exists and is character special

-d FILE

       FILE exists and is a directory

-e FILE

       FILE exists

-f FILE

       FILE exists and is a regular file

...

-h FILE

       FILE exists and is a symbolic link (same as -L)

4

অভ্যন্তরীণভাবে, rm কমান্ডটি অবশ্যই ফাইল অস্তিত্বের জন্য পরীক্ষা করতে হবে,
তবে কেন অন্য একটি পরীক্ষা যুক্ত করুন? শুধু ইস্যু

rm filename

এবং সেখানে ছিল কিনা তা পরে চলে যাবে not
আরএম-ফ ব্যবহার করুন আপনি কি অস্তিত্বহীন ফাইলগুলি সম্পর্কে কোনও বার্তা চান না।

যদি ফাইলটি উপস্থিত না থাকে তবে আপনাকে যদি কিছু পদক্ষেপ নিতে হয় তবে আপনাকে অবশ্যই এটি পরীক্ষা করতে হবে। আপনার উদাহরণ কোডের ভিত্তিতে, এই দৃষ্টান্তে এটি হয় না।


1
এটি আসলে আরএম কমান্ডের জন্য বেশ বৈধ উত্তর। অন্যান্য কমান্ডের জন্য আমি বরং -e দিয়ে পরীক্ষা করার পরামর্শ দিই।
warhansen

প্রশ্নটি জিজ্ঞাসা করে এমনটি নয়।
ক্রাইওনস

1
আপনি "... এবং (যদি তাই) ... সহ পুরো প্রশ্নটি পড়েন তবে প্রশ্নটি যা জিজ্ঞাসা করে এটি খুব বেশি ... এটি" অংশটি মুছে দেয়।
টিজি

1

যদি আপনি একটি এনএফএস ব্যবহার করেন তবে "পরীক্ষা" করাই একটি আরও ভাল সমাধান, কারণ আপনার এনএফএস বন্ধ থাকার ক্ষেত্রে আপনি এতে একটি সময়সীমা যুক্ত করতে পারেন:

time timeout 3 test -f 
/nfs/my_nfs_is_currently_down
real    0m3.004s <<== timeout is taken into account
user    0m0.001s
sys     0m0.004s
echo $?
124   <= 124 means the timeout has been reached

একটি "[-e my_file]" কনস্ট্রাক্ট হিমায়িত হবে যতক্ষণ না এনএফএস আবার কার্যকর হয়:

if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi

<no answer from the system, my session is "frozen">

testএবং [সমার্থক। আপনি ব্যবহার করতে পারেন timeoutসঙ্গে [পাশাপাশি, এবং testযদি NFS- র হ্যাং স্থির।
সেই অন্য লোক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.