আমি কীভাবে শেল ব্যবহার করে সমস্ত উপ-ডিরেক্টরিতে ফাইলগুলি অনুসন্ধান করতে পারি এবং তারপরে সেই ফাইলগুলি অনুলিপি করতে পারি?


8

আমি কীভাবে কেবল *। এমপি 3 ফাইলগুলি ls -R *.mp3একটি ডিরেক্টরিতে পুনরাবৃত্ত কমান্ড সহ সন্ধান করতে পারি যাতে বেশ কয়েকটি উপ ডিরেক্টরি রয়েছে এবং শেষে এই ফাইলগুলি আমার চয়ন করা ডিরেক্টরিতে অনুলিপি করে।

তোমার সহযোগিতার জন্যে ধন্যবাদ.

উত্তর:


14

আদেশটি হ'ল:

find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;

বিকল্প:

find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/

উদাহরণ:

alex@MaD-pc:~/test$ ls
1  2  3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt  2.mp3  3.txt

2:
4.txt  5.mp3  6.txt

3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3  5.mp3

আরও তথ্যের জন্য:

man find

বিচারকরাও গ্রহণ করবেন:find /path/to/dir/ -name '*.c' | xargs cp -t /target/
অলি

আমি বিচারকদের একজন এবং আমি এই সমাধানটি অস্বীকার করি 8-) মন্তব্যের জন্য ধন্যবাদ, আমি এটি যুক্ত করব :)
হাইট্রোমো

1
xargsসাধারণত অনেক দ্রুত হয়। আমি মাত্র একটি দ্রুত পরীক্ষা চালিয়েছি এখানে সি ফাইলের একটি লোড সন্ধান করে এবং ls -lসেগুলি চালিয়েছি । এটি 0 মি 2.420 সেকেন্ড xargsএবং 0 এম 25.494 এস এর জন্য -exec... স্পষ্টতই এই ক্ষেত্রে cpঅপারেশনটি বেশিরভাগ সময় নিতে চলেছে তাই সম্ভবত এটি কোনও ব্যাপার নয় তবে এটি লক্ষ করা উচিত।
অলি

আমি -n`` switch to the সদৃশ নামগুলির ক্ষেত্রে ওভাররাইট এড়ানোর জন্য সিপিই কমান্ড যুক্ত করার পরামর্শ দিচ্ছি (বা লক্ষ্য হিসাবে অনুলিপি করার আগে নকলের জন্য পরীক্ষা করে এমন স্ক্রিপ্ট লিখতে হবে)
বয়স্ক গীক

2

এটি করার আরও একটি উপায়ও রয়েছে যা আমি মনে করি আপনার উদ্দেশ্যটি নিখুঁতভাবে উপযুক্ত করবে। আপনি findএকটি whileলুপের সাথে একত্রিত করতে পারেন এবং এমনকি কোনওটি execবা একেবারে ব্যবহার করার প্রয়োজনও নেই xargs। উদাহরণস্বরূপ, আপনি যদি mp3sনিজের ডাউনলোড ফোল্ডার থেকে আপনার সঙ্গীত ফোল্ডারে অনুলিপি করতে চান , তবে আপনি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করবেন যা আমি বহুবার ব্যবহার করেছি।

যে ডিরেক্টরিগুলি findঅনুসন্ধান করে এবং ফলস্বরূপ ফাইলগুলি স্থাপন করে সেগুলি পরিবর্তন করে আপনি কীভাবে এটি চান তা পরিবর্তন করতে পারেন ; যদি কোনও ডিরেক্টরি না বর্ণিত হয় findতবে পুরো হোম ফোল্ডারটি অনুসন্ধান করবে। আপনি বা অন্যান্য কমান্ডে পরিবর্তন cpকরতে পারেন mv। এটি বেশ দ্রুত, কারণ আমি এটি মাত্র 3945 .jpgফাইল দিয়ে পরীক্ষা করেছি ! এটি একটি পাঠ্য সম্পাদকে অনুলিপি করুন, এটি সংরক্ষণ করুন এবং তারপরে চালিয়ে এটি কার্যকর করুন chmod +x myscript

#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f; 
do cp -- "$f" ~/Music ;
done

এই উল্লিখিত বাশ উইকিতে এটি প্রদর্শিত হবে যে কমান্ডের আউটপুট প্রক্রিয়া করতে whileলুপ এবং readকমান্ডগুলি একত্রিত করতে এটি কতটা কার্যকর is findএবং আমি যেভাবে এটি করেছি এটি নিশ্চিত করে যে স্ক্রিপ্টটি ফাঁকা বা অন্য অপ্রত্যাশিত বা বিশেষ অক্ষরের সাথে ফাইলের নাম জুড়ে এসেছিল না।

findকমান্ডের আরও সাধারণ তথ্যের জন্য , টার্মিনালে প্রবেশ করুন man findবা উবুন্টু ম্যানেজগুলি অনলাইনে দেখুন । সন্ধানের ব্যবহারের দুর্দান্ত পরিচিতির জন্য এই নিবন্ধটিও দেখুন ।


সহজ না find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; done?
স্টিবার্ট

আমার পদ্ধতিটি সর্বোত্তম অনুশীলনের প্রতিনিধিত্ব করে এবং স্ক্রিপ্টটি ভাঙ্গা থেকে রোধ করে, যেমনটি আমি উদ্ধৃত লিঙ্কটিতে উল্লেখ করেছি।

আহ, আমি দেখছি, এটি বিশেষ চরিত্রগুলি পরিচালনা করার যত্ন নিয়েছে, লিঙ্কটির জন্য ধন্যবাদ :)
স্টিবার্ট

আমি -n`` switch to the সদৃশ নামগুলির ক্ষেত্রে ওভাররাইট এড়ানোর জন্য সিপিই কমান্ড যুক্ত করার পরামর্শ দিচ্ছি (বা লক্ষ্য হিসাবে অনুলিপি করার আগে নকলের জন্য পরীক্ষা করে এমন স্ক্রিপ্ট লিখতে হবে)
বয়স্ক গীক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.