मैं इसका उपयोग करके cwd में सभी फ़ोल्डरों के टाइमस्टैम्प को अपडेट करने की कोशिश कर रहा हूं:
for file in `ls`; do touch $file; done
लेकिन यह काम नहीं करता है। कोई विचार क्यों?
मैं इसका उपयोग करके cwd में सभी फ़ोल्डरों के टाइमस्टैम्प को अपडेट करने की कोशिश कर रहा हूं:
for file in `ls`; do touch $file; done
लेकिन यह काम नहीं करता है। कोई विचार क्यों?
जवाबों:
अब तक के सभी उत्तरों (साथ ही प्रश्न में आपके उदाहरण) मान लेते हैं कि आप touch
निर्देशिका में सब कुछ चाहते हैं , भले ही आपने "सभी फ़ोल्डर्स को स्पर्श करें" कहा हो। यदि यह पता चला है कि निर्देशिका में फ़ाइलें और फ़ोल्डर हैं और आप केवल फ़ोल्डर्स को अपडेट करना चाहते हैं, तो आप उपयोग कर सकते हैं find
:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
या यदि आपका find
कार्यान्वयन गैर-मानक -mindepth
/ -maxdepth
विधेय का समर्थन नहीं करता है:
$ find . ! -name . -prune -type d -exec touch {} +
इस:
$ touch -c -- */
को छोड़कर अधिकांश गोले में काम करना चाहिए:
touch
निर्देशिकाओं के लिए भी सहानुभूति रखेगा*
अलावा अन्य गोले में csh
, tcsh
, zsh
, fish
या थॉम्पसन खोल (जो एक त्रुटि के बजाय रिपोर्ट करेंगे)। यहां, हम -c
इसके चारों ओर काम करने के लिए उपयोग कर रहे हैं , हालांकि यह अभी भी touch
एक गैर-निर्देशिका फ़ाइल कहला सकती है *
।केवल zsh
उन touch
निर्देशिकाओं के साथ , जिनमें छिपे हुए हैं:
touch -- *(D/)
{} \+
खास है find
वाक्य रचना - अधिक के लिए आदमी पृष्ठ पढ़ें। मुझे लगता है कि touch -c ./*/
यह भी काम करेगा।
-maxdepth 1
कमांड में शामिल होना चाहिए , ताकि find
सबफ़ोल्डर्स में पुनरावृत्ति न हो। ओपी सीवीडी में केवल उन फ़ोल्डरों को छूना चाहता है, न कि सबफ़ोल्डर्स।
प्रयत्न
touch ./*
यह अनावश्यक for
लूप से बचता है जो हर एक फ़ाइल के लिए एक नई प्रक्रिया को जन्म देता है और सभी फ़ाइल नामों के लिए काम करता है, यहां तक कि रिक्त स्थान वाले या विकल्प की तरह दिखने वाले भी -t
। केवल उसी समय यह काम नहीं करेगा जब आपके पास निर्देशिका में ऐसी कोई फ़ाइल (नॉन-डॉट) न हो, जिस स्थिति में आप नाम की फ़ाइल बनाना समाप्त करेंगे *
। इससे बचने के लिए, touch
अधिकांश कार्यान्वयन के विशिष्ट मामले के लिए एक -c
विकल्प है ( --no-create
जीएनयू संस्करणों में भी कहा जाता है), कोई भी फ़ाइलों को न बनाने के लिए, अर्थात
touch -c ./*
भी अच्छा संदर्भ देखें jasonwryan के जवाब के साथ ही इस एक ।
आपको आउटपुट को पार्स करने का प्रयास नहीं करना चाहिएls
।
इसके अलावा, आपको "$file"
किसी भी व्हाट्सएप पर कब्जा करने के लिए अपना उद्धरण देना चाहिए । Http://www.grymoire.com/Unix/Quote.html देखें
कुछ इस तरह से प्राप्त कर सकते हैं कि आप क्या कर रहे हैं:
for file in *; do touch "$file"; done
अधिक गहन स्पष्टीकरण के लिए पहले दो बैश नुकसान देखें ।
*
फ़ाइलों और निर्देशिकाओं को कैप्चर नहीं करता है जिनका नाम डॉट से शुरू होता है। इसे ठीक करने का एक तरीका dotglob
शेल विकल्प के माध्यम से सक्षम करना है shopt -s dotglob
।