লিনাক্স (এমভি বা সিপি) ফাইলগুলির একটি পাঠ্য তালিকা থেকে নির্দিষ্ট ফাইলগুলি?


34

আমার কাছে অনেকগুলি ফাইলের ডিরেক্টরি রয়েছে, যেমন সার্ভারে 50,000 পিডিএফ এবং অন্যান্য ফাইল রয়েছে। আমি নির্দিষ্ট একটি অন্য ডিরেক্টরিতে সরানো প্রয়োজন। আমি সিএসভি বা অন্য কোনও পাঠ্য বিন্যাসে সরানো দরকার এমন ফাইলগুলির একটি তালিকা তৈরি করতে পারি।

আমাকে যা করতে হবে তা হ'ল বাশ স্ক্রিপ্ট চালানো এবং টেক্সট ফাইলে তালিকাভুক্ত ফাইলগুলি অন্য ডিরেক্টরিতে কপি করা বা অনুলিপি করা।

এটি করার কোনও সহজ উপায় আছে? কোন পরামর্শ বা সংস্থান ব্যাপকভাবে প্রশংসা করা হবে।


এছাড়াও, ডিরেক্টরিগুলিতে যুক্ত করা হলে ফাইলগুলি এলোমেলোভাবে নামকরণ করা হয়। নামকরণের কোনও কনভেনশন বা কোনও যুক্তি নেই যা নির্দিষ্ট ফাইলগুলি সরানোর জন্য ব্যবহৃত হতে পারে।
জেস্টেপ

উত্তর:


26

rsync বিভিন্ন বিকল্প প্রক্রিয়া (ফাইল একটি তালিকা গ্রহণ করতে পারেন হয়েছে --files-from, --include-fromইত্যাদি)।

উদাহরণস্বরূপ, এটি কৌশলটি করবে:

rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory

2
উদাহরণ:rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
এনেব

28

অকার্যকর ব্যবহার এড়াতে cat(এবং যদি আপনি ব্যবহার না করেন rsync):

xargs -a file_list.txt mv -t /path/to/dest

যদি কোনও লাইনে প্রতি ফাইলগুলি তালিকাভুক্ত না করা হয় তবে এটিতে কোনও নতুন লাইন না থাকলে এটি কোনও বৈধ ফাইলের নাম পরিচালনা করবে।


2
এই পদ্ধতির একটি অসুবিধা হ'ল তালিকার ফাইলগুলিতে যদি পাথের নাম থাকে (যেমন তারা সকলেই একই ডিরেক্টরিতে না থাকে), এর ব্যবহারগুলি mvতাদের সমস্তকে একই গন্তব্য ডিরেক্টরিতে ভেঙে দেবে। rsyncগৃহীত উত্তরে পদ্ধতির এই সীমাবদ্ধতা ভোগা না।
জেসন আর

এছাড়াও, আমি এই কমান্ডটি চেষ্টা করেছি এবং xargs কোনও একক উদ্ধৃতি ("
তুলনামূলক

এটি আমার পক্ষে কাজ করেছে কারণ আমি একই লক্ষ্য ডিরেক্টরিতে ভিন্ন উত্সের পথ থেকে ফাইলগুলি চেয়েছিলাম।
সিউডোনিজ

15
for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done

ধরে নেওয়া বাশ, পাশাপাশি listoffilesপ্রতি লাইনে একটি ফাইল রয়েছে। আরএসসিএনসি রুটে আমার একমাত্র আপত্তি হ'ল ওপি ফাইলগুলি অনুলিপি না করে সরানোর কোনও পদ্ধতি জিজ্ঞাসা করে। রাজকীয় বিবাহের চেয়ে আরএসআইএনসিতে আরও বেশি পতাকা রয়েছে, তাই আমি নিশ্চিত যে এটি করার জন্য এটি আরও সংশোধন করা যেতে পারে, তবে কখনও কখনও সহজতর আরও ভাল হয়!


1
এই সমাধানগুলি আমাকে সবচেয়ে নমনীয় হিসাবে আঘাত করে। আমি সিপি বা এমভি এর পরিবর্তে আরএসইএনসি দিয়ে এটি শেষ করেছি কারণ আমার আপেক্ষিক ফাইল পাথ বিকল্পের প্রয়োজন needed
স্প্যামউইচ

4
ভাল লাগল, খালি জায়গাগুলিতে আমার সমস্যা ছিল, তাই আমি এটিকে সংশোধন করেছি:while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
ব্যবহারকারী 1182474

1
@ ব্যবহারকারী1182474 ধন্যবাদ, এবং ইনপুট পুনঃনির্দেশের মার্জিত ব্যবহার। উত্তরের সাথে সন্তুষ্টি দেখানোর traditionalতিহ্যবাহী পদ্ধতিটি হ'ল উত্তেজনা, উপায় দ্বারা!
ম্যাডহ্যাটার মোনিকাকে

1
@ user1182474 এর জন্য আপনাকে ধন্যবাদ! অনেকগুলি পরিবর্তনের সর্বশেষ পদক্ষেপটি আমার অ্যান্ড্রয়েডে আমার ওএসএক্স ব্যাকআপ ইউটিলিটিগুলি পোর্ট করতে কিছুটা অন্ধভাবে করতে হয়েছিল!
চার্লি গরিচানাজ

4

এটি আপনার থাকা পাঠ্য ফাইলের ফর্ম্যাটের উপর নির্ভর করে। উদাহরণস্বরূপ, আপনার যদি লিখিত ফাইলগুলির তালিকা থাকে তবে প্রতিটি ফাইল একটি নতুন লাইনে অবস্থিত। আপনি যেমন xargs ব্যবহার করতে পারেন:

$ cat your_text_file | xargs cp -t /path/to/destination

এছাড়াও, আপনি findকমান্ড উইথ -execঅপশনটি ব্যবহার করতে পারেন । ফাইলগুলি অনুলিপি / সরাতে।


3
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/

রাইকিঙ্কের কমান্ডগুলি cpবা mvকমান্ডগুলির সাথে অতিরিক্ত সুবিধা রয়েছে কারণ এটি যদি অস্তিত্ব না থাকে তবে এটি স্বয়ংক্রিয়ভাবে ফোল্ডার তৈরি করবে।


/path/to/sourceফাইল তালিকা থেকে পাথ নেওয়ার সময় কেন এটি প্রয়োজন?
বেজারো

@ বাজেরো হয়ত ফাইলের তালিকায় আপেক্ষিক পথ থাকতে পারে?
ভয়ংকর ওয়েদার

2

আমি মনে করি আরএসসিএনসি উত্তরটি আরও ভাল তবে কেবল অন্য বিকল্পের জন্য:

tar -cf - -T FILE_OF_FILENAMES_TO_MOVE.txt |(cd /path/to/new/dir && tar -xvf -)

এটি ডকস্পাইলের পক্ষে ভাল, কারণ উবুন্টু বেস ছবিতে ট্যার পাওয়া যায় তবে আরএসসিএনসি নয়।
ক্রিশ্চিয়ানপ

1

আমি দুর্ঘটনাক্রমে সম্পূর্ণ ডিরেক্টরি সরানোর পরিবর্তে কোনও গন্তব্য ডিরেক্টরিতে কোনও ডিরেক্টরি সম্পূর্ণ সামগ্রী অনুলিপি করেছিলাম। এর ফলে উত্স ডিরেক্টরিটি ডিরেক্টরিতে যুক্ত হওয়ার পরিবর্তে একটি বিশৃঙ্খলাযুক্ত গন্তব্য ডিরেক্টরিতে পরিণত হয়।

এটি ঠিক করার জন্য, আমি নিম্নলিখিতগুলি করেছি:

ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove উপরের কমান্ডটি ফাইলস্টমোভ ফাইল তৈরি করে যা গন্তব্য ডিরেক্টরিতে থাকা সমস্ত সামগ্রীর একটি তালিকা হবে, সময় অনুসারে বাছাই করা, যার অর্থ পুরানো থেকে নতুনতম।

তারপরে স্টাফটি সরানোর জন্য আমি এখন বিশৃঙ্খলাযুক্ত গন্তব্য ডিরেক্টরিটির একটি উপ-ডিরেক্টরি তৈরি করেছি।

mkdir /path/to/cluttered/destination/directory/newsubdirectory

তারপরে আমি ডিরেক্টরি তালিকার পুনরাবৃত্তি করেছি, স্ক্রিনে তালিকাবদ্ধ করা এবং আরও বিশদ প্রদর্শন না করে।

ls -lrht /path/to/cluttered/destination/directory/ এই লাইনটি ডিরেক্টরিটিকে তালিকাভুক্ত করে, যা আরোহণের তারিখ অনুসারে বাছাই করা হয় (সময় অনুসারে বাছাই করা) এবং এখন বিশৃঙ্খলাযুক্ত গন্তব্য ডিরেক্টরিতে প্রতিটি ফাইলের তারিখ / সময় স্ট্যাম্প সহ আরও তথ্য দেখায়। আমি ডিরেক্টরিগুলি এবং ফাইলগুলি কোথায় ছিল সেগুলি রাখতে চাই তা দেখানোর জন্য শীর্ষে শুরু করে আমি এটি উল্লেখ করি। ফাইলগুলির তারিখ / সময় স্ট্যাম্পের মধ্যে একটি ব্যবধান থাকবে যেখানে সমস্ত নতুন ফাইল শুরু হওয়া উচিত নয় n't

তারপরে আমি উপরের প্রথম ধাপে নির্মিত ফাইলস্টোম ফাইলটি সম্পাদনা করেছি (এটি তারিখ অনুসারে বাছাই করা হয়েছে) এবং সেখানে থাকা তালিকা থেকে কয়েকটি মুছে ফেলা হয়েছিল যে আমি মূল ডিরেক্টরি থেকে থাকতে চাই।

vim /opt/dircheck/filestomove শীর্ষস্থান থেকে মুছুন, সমস্ত ফাইল আপনি সরতে চান না।

তারপরে আমি আমার পোস্টের ফাইলগুলিকে আমার তৈরি নতুন ডিরেক্টরিতে স্থানান্তর করতে এই পোস্টে পূর্বে তালিকাবদ্ধ কমান্ডটি ব্যবহার করেছি।

sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory

এটি সমস্ত ফাইলকে দ্বিতীয় ভাগে সরিয়ে নিয়েছে। (দ্রষ্টব্য: শুরুতে আপনার সূডোর দরকার নাও হতে পারে, এটি ফাইল অনুমতিের বিষয়)।

এখন আমার মূল গন্তব্য ডিরেক্টরিটি দুর্দান্ত এবং পরিষ্কার এবং এতে বিশৃঙ্খলাযুক্ত সমস্ত ফাইল এবং ডিরেক্টরি সহ একটি নতুন ডিরেক্টরি রয়েছে।


1

যদি (এবং শুধুমাত্র যদি থাকে), আপনার ফাইলনামে কোনও ফাঁকা অক্ষর নেই (স্পেস, নিউলাইনস, যা কীভাবে পৃথক যুক্তিতে বিভক্ত করতে পারে তা সম্পর্কে জার্গ্সকে বিভ্রান্ত করবে) এবং আপনি নিউলাইন দ্বারা পৃথক করা ফাইলগুলির একটি তালিকা তৈরি করেন (একটি ফাইল প্রতি লাইন), আপনি যেমন কিছু করতে পারে।

cat filenames.txt | xargs mv -t /path/to/move/files/to

(সাধারণভাবে, মানুষ xargs দেখুন , এটি দুর্দান্ত)

যদি আপনার নির্দিষ্ট এমভি-তে বিকল্প বিকল্প না থাকে তবে আপনি কিছু কৌশলও পছন্দ করতে পারেন

( cat filenames.txt; echo; echo /path/to/move/files/to ) | xargs mv

দ্রষ্টব্য - সেগুলির মধ্যে নতুন লাইনের সাথে ফাইলের নাম থাকলে এটি প্রত্যাশা অনুযায়ী কাজ করবে না।


যাহোক; Ignacio এর উত্তর দেখুন, rsync এই স্টাফ জন্য সাজানো হয়।
কেজেটিল জোর্জেনসেন

cp, mvএবং এর মতো বিএসডি -র -tবিকল্প নেই , এবং /path/to/move

1
@ w17t - ফাইলনেমগুলির মত শব্দগুলি। টেক্সট কোনও নতুন লাইনের সাথে শেষ হয় না, হয় ফাইলনামস.টিএসটিএস্টের শেষে নিউলাইন যুক্ত করুন, বা এর মতো কিছু করুন(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
কেজেটিল জোয়ারগেনসেন

0

এর মতো কিছু চেষ্টা করুন:

cat list.txt | while read line; do mv "$line" /images; done

while read line; do mv $line /images; done < list.txt একক কমান্ড হিসাবে হতে পারে
উপেক্ষা

0

নিম্নলিখিতটি আমার জন্য কাজ করেছে যেখানে ডিরেক্টরি কাঠামো সংরক্ষণের সময় আমার সমস্ত নির্দিষ্ট পিএনজি ফাইলগুলি একটি নির্দিষ্ট পাথ (এবং সমস্ত সাবডার) থেকে একটি নতুন স্থানে অনুলিপি করা প্রয়োজন:

rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/

কারণ আরএসওয়াইএনসি প্রথমে ডিরেক্টরি কাঠামোর আয়না তৈরি করে, তারপরে ফাইলগুলি সিঙ্ক করে, আপনি খালি অতিরিক্ত ফোল্ডারগুলি দিয়ে শেষ করতে পারেন। এই খালি ডিরেক্টরিগুলি সরানোর জন্য আমি --প্রিন-খালি-ডায়ার্স পতাকা ব্যবহার করেছি used

আমার কোনও সম্পর্ক নেই, তবে উত্সকে এই সমাধানটি অনুপ্রাণিত করা উচিত বলে toণ দেওয়া ঠিক বলেছিলাম: http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/

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