গ্লোব ব্যবহার করে লুপের জন্য './' উল্লেখ করার কোনও সুবিধা আছে কি?


10

আমি ছাপ এটা ব্যবহার করা নিরাপদ হতে পারে অধীনে ছিল ./*.fastqযখন দিয়ে শেষ ফাইল অনুসন্ধানের জন্য .fastq। উদাহরণস্বরূপ, ./ফাইলটি ক্যাপচার করা রোধ করবে .fastq। এটি স্পষ্টতই ভুল, যেমন নীচের উদাহরণে দেখানো হয়েছে:

TMP_DIR=$(mktemp --directory)
mkdir -p ${TMP_DIR}
(cd ${TMP_DIR}
 touch {a,b,c,}.fastq
 ls -a
 echo ""

 echo "# match all:"
 for f in *.fastq ; do
     echo "${f}"
 done
 echo ""

 echo "# with ./:"
 for f in ./*.fastq ; do
     echo "${f}"
 done
)
rm -rf ${TMP_DIR}
.
..
a.fastq
b.fastq
c.fastq
.fastq

# match all:
a.fastq
b.fastq
c.fastq

# with ./:
./a.fastq
./b.fastq
./c.fastq

আমরাও *.fastqনা ./*.fastqফাইল মেলে .fastq। তাই আমি এখনই অবাক হচ্ছি, এখানে কোনও ব্যবহার ./*.fastqনেই, বা ./*সাধারণভাবে?


1
সাধারণ বিন্দুটি ./*হ'ল এটি নিশ্চিত করে যে নামগুলির সাথে শুরু হওয়া নামগুলি -বিকল্প হিসাবে বিবেচিত হবে না।
চার্লস ডাফি

উত্তর:


15

এটি প্রাথমিকভাবে আশ্চর্যজনক ওয়াইল্ডকার্ড আচরণ, যেহেতু *ওয়াইল্ডকার্ড চরিত্রের বিবরণ বলে:

নাল স্ট্রিং সহ যে কোনও স্ট্রিংয়ের সাথে মেলে।

... যতক্ষণ না আপনি বুঝতে পারি যে সময়ের সামান্য বিশেষ যখন এটা প্রথম একটি ফাইলের নাম চরিত্র। প্রবর্তক পাঠ্যটি এতে 3.5.8 Filename Expansionবলেছে:

ফাইলের নাম প্রসারণের জন্য যখন কোনও প্যাটার্ন ব্যবহৃত হয়, তখন অক্ষর '' ' কোনও ফাইল নামের শুরুতে বা তত্ক্ষণাত্ স্ল্যাশ অনুসরণ করে অবশ্যই স্পষ্টভাবে মিলিত হওয়া উচিত, যতক্ষণ না শেল বিকল্প ডটগ্লোব সেট না করা হয়।

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

# I want a file named `-n`
$ touch -n
touch: invalid option -- 'n'
Try 'touch --help' for more information.
$ touch -- -n
### ok
$ touch ./-n
### ok

... এবং এখন যে আমার কাছে একটি ফাইল রয়েছে -n, যদি আমি কোনও ওয়াইল্ডকার্ড দিয়ে লুপ করতে যাই:

for file in *n
do
  echo "$file"
done

... আমি কোন আউটপুট পাই না!

তবে আমি যদি ওয়াইল্ডকার্ডের সাথে উপসর্গ করি ./,

for file in ./*n
do
  echo "$file"
done
./-n

... আমি ফাইলের নাম দেখছি।

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

for file in *n
do
  mv -- "$file" backup/"$file"
done

... যা নিরাপদে -nফাইলের নামটি mv(নীচে দেখানো হয়েছে set -x) এ পাস করবে :

mv -- -n backup/-n
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.