পাস করা আর্গুমেন্ট বাশ-এ ফাইল বা ডিরেক্টরি কিনা তা পরীক্ষা করুন


156

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

নীচে আমার বুনিয়াদি কোডটি নীচে এবং কয়েকটি পরীক্ষা tests

#!/bin/bash

PASSED=$1

if [ -d "${PASSED}" ] ; then
    echo "$PASSED is a directory";
else
    if [ -f "${PASSED}" ]; then
        echo "${PASSED} is a file";
    else
        echo "${PASSED} is not valid";
        exit 1
    fi
fi

এবং আউটপুট এখানে:

andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory

andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file

andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid

andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid

এই সমস্ত পাথ বৈধ, এবং বিদ্যমান।


5
if- elseবাশের নির্মাণগুলিও সমর্থন করে elif। শুধু এফওয়াইআই।

3
@glenn - কৌতূহলীভাবে, ভেরিয়েবল অ্যাসাইনমেন্টে কোটগুলির প্রয়োজন হয় না।
জন কুগেলম্যান

উত্তর:


211

এটা কাজ করা উচিত। কেন এটি ব্যর্থ হচ্ছে তা আমি নিশ্চিত নই। আপনি আপনার ভেরিয়েবলগুলি সঠিকভাবে উদ্ধৃত করছেন। আপনি যদি এই স্ক্রিপ্টটি ডাবল ব্যবহার করেন তবে কী হবে [[ ]]?

if [[ -d $PASSED ]]; then
    echo "$PASSED is a directory"
elif [[ -f $PASSED ]]; then
    echo "$PASSED is a file"
else
    echo "$PASSED is not valid"
    exit 1
fi

ডাবল স্কোয়ার ব্র্যাকেটগুলি এতে বাশ এক্সটেনশন [ ]। এটিতে ভেরিয়েবলগুলি উদ্ধৃত করার প্রয়োজন হয় না, এমনকি যদি তাদের স্পেস থাকে তবে।

চেষ্টা -eকরার মতো মূল্য: এটি কী ধরণের ফাইল তা পরীক্ষা না করে কোনও পাথ উপস্থিত থাকলে তা পরীক্ষা করা।


9

কমপক্ষে গুল্ম গাছ ছাড়া কোডটি লিখুন:

#!/bin/bash

PASSED=$1

if   [ -d "${PASSED}" ]
then echo "${PASSED} is a directory";
elif [ -f "${PASSED}" ]
then echo "${PASSED} is a file";
else echo "${PASSED} is not valid";
     exit 1
fi

আমি যখন এটিকে "xx.sh" একটি ফাইলে রাখি এবং "xx sh" ফাইল তৈরি করি এবং চালিত করি, তখন আমি পাই:

$ cp /dev/null "xx sh"
$ for file in . xx*; do sh "$file"; done
. is a directory
xx sh is a file
xx.sh is a file
$

আপনার সমস্যা হচ্ছে তা প্রদত্ত, আপনার স্ক্রিপ্টটি যুক্ত করে ডিবাগ করা উচিত:

ls -l "${PASSED}"

এটি আপনাকে lsস্ক্রিপ্টটি পাস করার নামগুলির বিষয়ে কী ভাববে তা দেখাবে ।


4

"ফাইল" কমান্ড ব্যবহার করা এর জন্য কার্যকর হতে পারে:

#!/bin/bash
check_file(){

if [ -z "${1}" ] ;then
 echo "Please input something"
 return;
fi

f="${1}"
result="$(file $f)"
if [[ $result == *"cannot open"* ]] ;then
        echo "NO FILE FOUND ($result) ";
elif [[ $result == *"directory"* ]] ;then
        echo "DIRECTORY FOUND ($result) ";
else
        echo "FILE FOUND ($result) ";
fi

}

check_file "${1}"

আউটপুট উদাহরণ:

$ ./f.bash login
DIRECTORY FOUND (login: directory) 
$ ./f.bash ldasdas
NO FILE FOUND (ldasdas: cannot open `ldasdas' (No such file or  directory)) 
$ ./f.bash evil.php 
FILE FOUND (evil.php: PHP script, ASCII text) 

এফওয়াইআই: উপরের উত্তরগুলি কাজ করে তবে আপনি প্রথমে একটি বৈধ ফাইলের জন্য পরীক্ষা করে অদ্ভুত পরিস্থিতিতে সহায়তা করতে পারেন:

#!/bin/bash

check_file(){
    local file="${1}"
    [[ -s "${file}" ]] || { echo "is not valid"; return; } 
    [[ -d "${file}" ]] && { echo "is a directory"; return; }
    [[ -f "${file}" ]] && { echo "is a file"; return; }
}

check_file ${1}

সুতরাং, খালি ফাইলগুলি বৈধ নয় (কারণ -sশূন্য নয় এমন ফাইলের জন্য যাচাই করে নেওয়া হয়, শূন্য নন মাপের একটি)? এবং আপনি কোনও ব্লক বিশেষ, চরিত্র বিশেষ, ফিফো ইত্যাদির জন্য কোনও নির্ণয় মুদ্রণ করবেন না? সিমলিংকগুলি সম্ভবত লিঙ্কটির শেষ প্রান্তে কী সমাধান করেছে; ভাঙা symlinks আরও সমস্যাযুক্ত।
জোনাথন লেফলার

আপনি কী সম্পাদনা হিসাবে পরামর্শ দিচ্ছেন, আমি আপনার ভাষ্য অনুসরণ করছি না
মাইক কিউ

এর --briefপতাকা ব্যবহার করুন file। এটি কেবল directoryযখন আউটপুট হয়।
বারক্যান্ট ইপেক

2

ব্যবহার -fএবং -dস্যুইচ করুন /bin/test:

F_NAME="${1}"

if test -f "${F_NAME}"
then                                   
   echo "${F_NAME} is a file"
elif test -d "${F_NAME}"
then
   echo "${F_NAME} is a directory"
else                                   
   echo "${F_NAME} is not valid"
fi

সাধারণভাবে বলতে গেলে, সমান উত্তর ইতিমধ্যে উপলব্ধ থাকলে আপনার কোনও পুরানো প্রশ্নের নতুন উত্তর যুক্ত করার জন্য বিরক্ত করা উচিত নয়। যদি আপনার কাছে কিছু চমকপ্রদ নতুন তথ্য যুক্ত হয় তবে সমস্ত অর্থ একটি উত্তর দিন। তবে আপনি যা বলেছেন তা ইতিমধ্যে বলা হয়েছে। ( testসাধারণত একটি শেলটি অন্তর্নির্মিত, যদিও এখানে সাধারণত কার্যকর কার্যকরও থাকে /bin/test, এবং এটিও /bin/[))
জোনাথন লেফলার

1

আরও মার্জিত সমাধান

echo "Enter the file name"
read x
if [ -f $x ]
then
    echo "This is a regular file"
else
    echo "This is a directory"
fi

2
কমান্ড লাইন আর্গুমেন্ট ব্যবহার না করে ইনপুটগুলির জন্য প্রম্পট করা সাধারণত "আরও মার্জিত" হয় না। আপনি পরীক্ষা পরিবর্তনশীল উদ্ধৃত করা উচিত: if [ -f "$x" ]
জোনাথন লেফলার

1
function check_file_path(){
    [ -f "$1" ] && return
    [ -d "$1" ] && return
    return 1
}
check_file_path $path_or_file

-1

এই ছটফট কাজ:

#!/bin/bash

echo "Enter your Path:"
read a

if [[ -d $a ]]; then 
    echo "$a is a Dir" 
elif [[ -f $a ]]; then 
    echo "$a is the File" 
else 
    echo "Invalid path" 
fi

2
দয়া করে, আপনি যখন কোনও প্রশ্নের উত্তর দেন তখন আপনি কিছু ব্যাখ্যা যুক্ত করতে পারেন?
সাবস্টিয়ান টেম্পাডো

-2
#!/bin/bash                                                                                               
echo "Please Enter a file name :"                                                                          
read filename                                                                                             
if test -f $filename                                                                                      
then                                                                                                      
        echo "this is a file"                                                                             
else                                                                                                      
        echo "this is not a file"                                                                         
fi 

আউটপুটে ফাইলের নামটি প্রতিধ্বনি করা ভাল, যেমন প্রশ্নের কোডটি করে। এটি পরিষ্কার নয় যে কোনও ফাইলের নামের জন্য অনুরোধ করা একটি উন্নতি। কোড ফাইল, ডিরেক্টরি এবং 'অন্যান্য' এর মধ্যে পার্থক্য করে না। কোনও উত্তর না থাকলে কোনও পুরানো প্রশ্নের নতুন উত্তর যুক্ত করা ঠিক আছে, বা আপনার কাছে নতুন তথ্য দেওয়ার দরকার আছে। এখানে বিষয়টি তেমন নয়।
জোনাথন লেফলার

-2

এক রৈখিক

touch bob; test -d bob && echo 'dir' || (test -f bob && echo 'file')

ফলাফল সত্য (0) (dir) বা সত্য (0) (ফাইল) বা মিথ্যা (1) (কোনটি)


যদি আমি প্রতিস্থাপন touch bobসঙ্গে mkdir bob, আমি আউটপুট পাবেন: dirএবং fileদুই লাইন উপর।
জোনাথন লেফলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.