एक डायरेक्टरी में सभी फोल्डर को टच करें


14

मैं इसका उपयोग करके cwd में सभी फ़ोल्डरों के टाइमस्टैम्प को अपडेट करने की कोशिश कर रहा हूं:

for file in `ls`; do touch $file; done

लेकिन यह काम नहीं करता है। कोई विचार क्यों?

जवाबों:


21

अब तक के सभी उत्तरों (साथ ही प्रश्न में आपके उदाहरण) मान लेते हैं कि आप 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/)

'{} \ +' के बारे में क्या है?
javamonkey79

3
{} \+खास है findवाक्य रचना - अधिक के लिए आदमी पृष्ठ पढ़ें। मुझे लगता है कि touch -c ./*/यह भी काम करेगा।
jw013

2
आपको -maxdepth 1कमांड में शामिल होना चाहिए , ताकि findसबफ़ोल्डर्स में पुनरावृत्ति न हो। ओपी सीवीडी में केवल उन फ़ोल्डरों को छूना चाहता है, न कि सबफ़ोल्डर्स।
स्टीवन मंडे

1
@ jw013 यह होगा - आप अन्य लोगों के जवाब :) करने के लिए अच्छे विचार संलग्न रखने
माइकल Mrozek

आप + चरित्र से क्यों बचेंगे? क्या ऐसे गोले हैं जो इसकी व्याख्या करते हैं?
विटिको

11

प्रयत्न

touch ./*

यह अनावश्यक forलूप से बचता है जो हर एक फ़ाइल के लिए एक नई प्रक्रिया को जन्म देता है और सभी फ़ाइल नामों के लिए काम करता है, यहां तक ​​कि रिक्त स्थान वाले या विकल्प की तरह दिखने वाले भी -t। केवल उसी समय यह काम नहीं करेगा जब आपके पास निर्देशिका में ऐसी कोई फ़ाइल (नॉन-डॉट) न हो, जिस स्थिति में आप नाम की फ़ाइल बनाना समाप्त करेंगे *। इससे बचने के लिए, touchअधिकांश कार्यान्वयन के विशिष्ट मामले के लिए एक -cविकल्प है ( --no-createजीएनयू संस्करणों में भी कहा जाता है), कोई भी फ़ाइलों को न बनाने के लिए, अर्थात

touch -c ./*

भी अच्छा संदर्भ देखें jasonwryan के जवाब के साथ ही इस एक


1
अगर आपके पास cwd में 1 मिलियन फोल्डर हैं तो क्या होगा?
स्टीवन मंडे

यदि आप "तर्क सूची में बहुत लंबे" प्रकार की समस्याओं में भाग लेते हैं, तो संभवत: "भारी" टूल जैसे कि स्विच करना सबसे अच्छा है find . -type d -maxdepth1 -print0 | xargs -0 touch, या माइकलरोज़ेक का उत्तर
jw013

7

आपको आउटपुट को पार्स करने का प्रयास नहीं करना चाहिएls

इसके अलावा, आपको "$file"किसी भी व्हाट्सएप पर कब्जा करने के लिए अपना उद्धरण देना चाहिए । Http://www.grymoire.com/Unix/Quote.html देखें

कुछ इस तरह से प्राप्त कर सकते हैं कि आप क्या कर रहे हैं:

for file in *; do touch "$file"; done

अधिक गहन स्पष्टीकरण के लिए पहले दो बैश नुकसान देखें ।


2
बंद करें लेकिन काफी नहीं। ए touch ./*को ज्यादातर मामलों में काम करना चाहिए। वास्तव में forलूप की कोई आवश्यकता नहीं है क्योंकि touchकई फाइलें ले सकते हैं, और आपको ठीक से ./नाम के साथ फाइलों को संभालने की आवश्यकता --helpहै। यह इस विषय पर एक अच्छा संसाधन है
jw013

Work * ’क्यों काम करता है?
javamonkey79

@ javamonkey79 यह खोल ग्लोबिंग
jw013

1
@ jw013 उत्कृष्ट बिंदु: और व्हीलर लिंक के लिए धन्यवाद।
जसोनव्रीयन

ध्यान दें कि उन *फ़ाइलों और निर्देशिकाओं को कैप्चर नहीं करता है जिनका नाम डॉट से शुरू होता है। इसे ठीक करने का एक तरीका dotglobशेल विकल्प के माध्यम से सक्षम करना है shopt -s dotglob
विटिको

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