একটি ডিরেক্টরিতে সমস্ত ফোল্ডার স্পর্শ করুন


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সিনট্যাক্স - আরো জন্য man পৃষ্ঠা পড়ুন। আমি মনে করি touch -c ./*/পাশাপাশি কাজ করবে।
jw013

2
-maxdepth 1আপনার কমান্ডটি অন্তর্ভুক্ত করা উচিত , যাতে এটি findসাবফোল্ডারগুলিতে পুনরাবৃত্তি না করে। ওপি মনে করে যে কেবল ফোল্ডারগুলিকে কেবল সিডব্লিউডে স্পর্শ করতে চায়, সাবফোল্ডারগুলি নয়।
স্টিভেন সোমবার

1
@ jw013 এটি হবে - আপনি অন্য লোকের
জবাবগুলিতে

আপনি কেন + চরিত্র থেকে বাঁচবেন? শাঁস আছে যে এটি ব্যাখ্যা করে?
উইটিকো

11

চেষ্টা

touch ./*

এটি অপ্রয়োজনীয় forলুপটি এড়িয়ে চলে যা প্রতিটি ফাইলের জন্য একটি নতুন প্রক্রিয়া তৈরি করে এবং সমস্ত ফাইলের নামের জন্য কাজ করে, এমনকি ফাঁকা স্থানগুলি বা বিকল্পগুলির মতো দেখতে (যেমন -t) দেখায় । কেবলমাত্র এটি কাজ করবে না যদি আপনার যদি কোনও ডিরেক্টরিতে (নন-ডট) ফাইল না রেখে থাকেন তবে আপনি নামের ক্ষেত্রে একটি ফাইল তৈরি করবেন *। এটি এড়ানোর জন্য, touchবেশিরভাগ বাস্তবায়নের নির্দিষ্ট ক্ষেত্রে অস্তিত্বহীন ফাইল তৈরি না করার জন্য একটি -cবিকল্প ( --no-createজিএনইউ সংস্করণেও ডাকা হয়) রয়েছে ie

touch -c ./*

এছাড়াও ভাল রেফারেন্স দেখুন jasonwryan এর উত্তর সেইসাথে এই এক


1
সিডব্লিউডিতে আপনার 1 মিলিয়ন ফোল্ডার থাকলে কী হবে?
স্টিভেন সোমবার

আপনি মধ্যে "আর্গুমেন্ট তালিকার অত্যন্ত দীর্ঘ" টাইপ সমস্যার চালানো যদি মত "গুরুতর" সরঞ্জাম সুইচ সেরা সম্ভবত find . -type d -maxdepth1 -print0 | xargs -0 touch, অথবা MichaelMrozek এর উত্তর উপরে।
jw013

7

আপনি আউটপুট পার্স করার প্রচেষ্টা করা উচিত নয়ls

এছাড়াও, "$file"কোনও সাদা স্থান ক্যাপচার করার জন্য আপনার উদ্ধৃতি দেওয়া উচিত । Http://www.grymoire.com/Unix/Quote.html দেখুন

এর পরে এমন কিছু হতে পারে যা আপনি পরে যা করতে পারেন:

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

আরও বিশদ ব্যাখ্যার জন্য প্রথম দুটি বাশ পিটফলস দেখুন।


2
বন্ধ কিন্তু বেশ না। এ touch ./*বেশিরভাগ ক্ষেত্রে কাজ করা উচিত। একাধিক ফাইল নিতে পারে forসেহেতু লুপটির সত্যিই প্রয়োজন নেই touch, এবং ./নামগুলির মতো ফাইলগুলি --helpসঠিকভাবে হ্যান্ডেল করা আপনার দরকার । এটি বিষয়টিতে একটি ভাল সংস্থান
jw013

'*' কাজ করে কেন?
javamonkey79

@ জাভমনকি It's৯ এটি শেল গ্লোব করছে
jw013

1
@ jw013 দুর্দান্ত পয়েন্ট: এবং হুইলারের লিঙ্কটির জন্য আপনাকে ধন্যবাদ।
জেসনওয়ারিয়ান

মনে রাখবেন যে *ফাইল এবং ডিরেক্টরি ক্যাপচার করে না যার নাম একটি বিন্দু দিয়ে শুরু হয়। এটির সমাধানের একটি উপায় হ'ল dotglobশেল বিকল্পটি এর মাধ্যমে সক্ষম করা shopt -s dotglob
উইটিকো

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