क्या ग्लोब का उपयोग करके लूप के लिए './' को निर्दिष्ट करने में कोई फायदा है?


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यह कहता है:

जब फ़ाइल नाम विस्तार के लिए एक पैटर्न का उपयोग किया जाता है, तो चरित्र '।' फ़ाइल नाम के प्रारंभ में या तुरंत एक स्लैश का अनुसरण करते हुए स्पष्ट रूप से मिलान किया जाना चाहिए, जब तक कि शेल विकल्प डॉटग्लोब सेट न हो।

वाइल्डकैड्स के साथ उपसर्ग करने का "उपयोग पैटर्न" बैश शेल में अग्रणी डैश के साथ नामों को संभालने के./ लिए उपयोगी है , जैसा कि स्टीलड्राइ ने टिप्पणी की थी। वाइल्डकार्ड / फ़ाइल नाम के विस्तार पर इसका कोई प्रभाव नहीं पड़ता है, लेकिन जब आप उन्हें संदर्भित करते हैं, तो फ़ाइल नाम को हैंडल करना सुरक्षित / आसान बना देता है, यदि वे पात्रों के साथ शुरू करते हैं, तो उन कार्यक्रमों को विकल्पों के रूप में गलत व्याख्या कर सकते हैं। उदाहरण के लिए:

# 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.