Regular এমভি`কে কীভাবে একটি একক নিয়মিত ফাইলের সংগ্রহে স্থানান্তরিত করা যায়?


17

আমি আমার বোকা ভুল করে আমার অডিও সংগ্রহের একটি ছোট্ট অংশ হারিয়েছি। :-(
আনন্দের সাথে আমার বেশ সাম্প্রতিক ব্যাকআপ ছিল, তবে এটি এখনও জ্বালাময়ী ছিল yoursআপনার সত্যতা ছাড়া অন্য দুষ্কর্মকারী অন্য অপরাধী ছিলেন mv, যা নীচে প্রদর্শিত হবে:

অডিও ফাইলগুলির একটি নির্দিষ্ট স্কিম ছিল:

ARTIST - Some Title YY.mp3

যেখানে YY2-অঙ্কের বছরের স্পেসিফিকেশন।

mkdir 90<invisible control character>

(এই মুহুর্তে, আমি জানতাম না যে আমি আসলে একটি তৃতীয়াংশ অতিরিক্ত চরিত্রটি টাইপ করেছি যা অদৃশ্য ...!)
সমস্ত একই ডিরেক্টরিতে থাকার পরিবর্তে, আমি 1990 এর সমস্ত সংগীত একটি ডিরেক্টরিতে রাখতে চেয়েছিলাম। সুতরাং আমি টাইপ করেছি:

find . -name '* 9?.mp3' -exec mv {} 90 \;

এত শক্ত ধারণা না পেয়ে এহ কি হল? : ->
(বিপর্যয়মূলক) ফলাফলের কুমারী ছিল খালি ডিরেক্টরি '90 নামক কিছু '(সঙ্গে কিছু "অদৃশ্য" নিয়ন্ত্রণ চরিত্র হচ্ছে) এবং একটি একক ফাইল নামক' 90 ', ওভাররাইট এন বার।

সমস্ত ফাইলগুলি গিয়েছিল। : - (((স্পষ্টতই))

ইচ্ছা mvকরেছি হবে চেক করা : সময় কিনা গন্তব্য "ফাইল" স্বাক্ষর (* কিসসু উপর মনে রাখবেন মধ্যে সবকিছু থাকা অবস্থায় কোনো ফাইল সঙ্গে একটি শুরু হয়) d------(যেমন drwxr-xr-x)। এবং, অবশ্যই, গন্তব্য আদৌ বিদ্যমান কিনা । সেখানে উপরোক্ত দৃশ্যকল্প, যখন আপনি কেবল একটি বৈচিত্র হয় ভুলে গেছি করার mkdirপ্রথম ডিরেক্টরি। (তবে অবশ্যই, আপনি ধরে নিয়েছেন যে এটি আছে ...)

এমনকি আমাদের পোষা-ঘৃণ্য ওএসও মূলধন দিয়ে শুরু করে ডাব্লু এটি করে । এমনকি আপনি পেতে অনুরোধ জানানো গন্তব্য প্রকার (ফাইল? ডিরেক্টরি?) যদি আপনি এটি জন্য জিজ্ঞাসা করুন।

অতএব, আমি ভাবছি mvযে এই ধরণের অতি অযাচিত চমকগুলি এড়াতে আমাদের যদি NIXers এখনও নিজেকে " স্ক্রিপ্টলেট" লিখতে হয় ?


2
সমস্ত ফাইল শেষ ছিল না। .mp3নাম সহ কমপক্ষে একটি থাকা উচিত 90, এটি এমন একটি হতে পারে যার জন্য আপনার ব্যাকআপ নেই।
অ্যান্থন

2
হেই, আপনি হাস্যকর বোধ পেয়েছেন, আপনি বাদ্যযন্ত্র! :- পি ওয়েল, ওপিতে সাহসী প্রিন্টে "ওয়ান সিঙ্গল ফাইল" নামক ফাইলটি ছিল। :)
সিনট্যাক্সেরর

2
mvপ্রযুক্তিগতভাবে এখানে সমস্যা নয়, এটি জানে না যে আপনি একটি সিরিজের বিভিন্ন ফাইল সরিয়ে নিচ্ছেন। আপনি mvপ্রতিটি ফাইলের জন্য একটি সময় চালাচ্ছেন । এভাবেই find -exec ;কাজ করে। যদি আপনি ব্যবহার করেন find -exec +(কিছু মন্তব্য হিসাবে) এটি একাধিক যুক্তি পেয়ে সঙ্গে সঙ্গে চিৎকার mv করতে হবে।
এটান রিজনার

যদিও mvপ্রতিটি একক ফাইলের জন্য চালানো প্রথমে কিছুটা কম চিন্তাভাবনা বলে মনে হচ্ছে, উত্স ফাইলগুলি বিভিন্ন সাব-ডিরেক্টরিতে ছড়িয়ে ছিটিয়ে গেলে এটি (যেমন আমি আগেই বলেছি) একমাত্র বুদ্ধিমান সমাধান হবে। আমার পরীক্ষার ক্ষেত্রে, উত্স ফাইলগুলি সমস্তই একটি ডিরেক্টরিতে ছিল তার অর্থ এই নয় যে এটি আমার আসল পরীক্ষার কেস। এটি প্রকৃতপক্ষে একটি সরলকরণ, কারণ আমি পরে নিজেরাই এটি সহজেই ব্যাখ্যা করতে পারি। এছাড়াও, এটি তাদের কম দৈর্ঘ্যের কারণে পড়তে প্রশ্নগুলি কম সময়সাপেক্ষ করে। :)
সিনট্যাক্সেরর

আপনি কেন mvগন্তব্য বিদ্যমান থাকার প্রয়োজন আশা করবেন? mv oldfile newfileকোনও ফাইলের নাম পরিবর্তন করার উপায় এবং এটি newfileইতিমধ্যে বিদ্যমান এবং একটি ডিরেক্টরি হওয়ার প্রত্যাশা করা নির্বোধ ।
বার্মার

উত্তর:


37

আপনি /যদি কোনও ডিরেক্টরিতে ফাইলগুলি স্থানান্তর করতে চান তবে আপনি গন্তব্যে একটি যুক্ত করতে পারেন। ডিরেক্টরি উপস্থিত না থাকলে আপনি একটি ত্রুটি পাবেন:

mv somefile somedir/
mv: cannot move ‘somefile’ to ‘somedir/’: Not a directory

ডিরেক্টরি উপস্থিত থাকলে, ফাইলটি সেই ডিরেক্টরিতে স্থানান্তরিত করে।


4
তোমাকে অনেক ধন্যবাদ! সেটাই আমার ভবিষ্যতের জীবন রক্ষাকারী হওয়া উচিত। আমি তোমার এক owণী (ঠিক যেমন একটি দ্রষ্টব্য, আমার এক বন্ধু বেশ কয়েক বছর আগেও একই ভুল করেছিল, তাই আমি অনুভব করি যে আমি একা নই।)
সিনট্যাক্সারর

1
এছাড়াও, নির্দিষ্ট শেল ব্যবহার করার সময়, আপনার নিজের জন্য ফাইলের নাম স্বয়ংক্রিয়ভাবে পূর্ণ করার জন্য ট্যাব বিকল্প রয়েছে have যদি আমি ডিরেক্টরিটির নামটি পুরোপুরি মনে করতে না পারি এবং আপনার মতো কোনও জগাখিচুড়ি চাই না, তবে কেবলমাত্র নামের একটি অক্ষর বা দুটি নামের নাম এবং এইচআইটি ট্যাবকে ঘুষি মারুন । তারপরে আপনি নিশ্চিত হতে পারেন, এটি বিদ্যমান, কারণ স্বয়ংক্রিয়ভাবে এটি এটিকে রেখে দেয় ....
অ্যান্ডিজ স্মিথ

@ অ্যান্ডিজস্মিথ ওয়েল, এটি খুব জিনিস। আপনি কখনও জটিল ডিরেক্টরি বা পাথের জন্য কেবল ট্যাব ব্যবহারের জন্য এটি আমার অভ্যাস হিসাবে অভিহিত করতে পারেন , তবে 2-বর্ণের ধরণের জন্য নয় :) :) তবে এটি ভাবতে আসুন ... সম্ভবত আমার পরবর্তী বিষয়টিকেও সত্যই বিবেচনা করা উচিত এখন থেকে.
সিনট্যাক্সেরার

20

জিএনইউ কোর্টিলগুলিতে mvইতিমধ্যে একটি বিকল্প রয়েছে যা উল্লেখ করে যে আপনি একটি ডিরেক্টরিতে যেতে চান: -t/ --target-directory। যদি সেই বিকল্পটিতে যুক্তি উপস্থিত না থেকে থাকে তবে mvআপনার সমস্ত ফাইলকে একই ফাইলনামে স্থানান্তরিত করার পরিবর্তে অভিযোগ করবে।

আমি আপনার মুভারটি নিম্নরূপে লিখতাম:

find . -name '* 9?.mp3' -exec mv -t 90 {} +

এর +পরিবর্তে \;, যতগুলি সম্ভব ফাইল ফাইলের নাম একসাথে গ্লোবাইটিংয়ের ব্যবহারটি নোট করুন , যার ফলে দ্রুত প্রয়োগ হয়।


ধন্যবাদ। (আশা করি এটি আবার সেই জিএনইউ-
ইসেমগুলির মধ্যে একটি নয়

2
@বাক্যগঠন ত্রুটি. এটি একটি জিএনইউজম। পজিক্লি:find . -name '* 9?.mp3' -exec sh -c 'exec mv "$@" 90/' sh {} +
স্টাফেন

এই স্নিগ্ধ ওয়ান-লাইনারের জন্য আপনাকে অনেক ধন্যবাদ! ভেবে দেখুন এটি আপনাকে দেওয়া একটি +5 ছিল। :) প্রচুর ট্রায়াল-অ্যান্ড-ত্রুটির চেষ্টা অপ্রয়োজনীয় করে ফেলবে ----- এবং আপনি কেন খুব ভাল জানেন যে আমি কেন এই মন্তব্যটি করেছি। কেবল এমন কোনও মেশিনে থাকা দরকার যা সরাসরি পোজিক্স হয় (খুব কমই ঘটে না), এবং আমি ঠিক পরের সমস্যাটি এখানেই নিয়ে যাচ্ছি। :)
সিনট্যাক্সেরর

1
@ সাইন্ট্যাক্সররর যদি এই উত্তরটি আপনার সমস্যাটির সমাধান করে তবে দয়া করে এক মিনিট সময় নিয়ে যান এবং বামে ভোট গণনার নীচে চেক চিহ্নটি ক্লিক করুন, এটি প্রত্যেককে বোঝায় যে আপনার সমস্যাটি সমাধান হয়েছে এবং এটিই এই সাইটের মধ্যে ধন্যবাদ প্রকাশ করার উপায়। আমি দেখেছি যে কেবলমাত্র আপনার উত্তর দেওয়া অন্যান্য কয়েকটি প্রশ্নের উত্তর গৃহীত হয়েছে, আপনি সেগুলিও প্রকাশ করতে চাইতে পারেন।
অ্যান্থন

না, এটি কেবল উদ্দেশ্য। আমি উত্তর গ্রহণ না করা পর্যন্ত আমি প্রায়শই কয়েক সপ্তাহ বা মাঝে মাঝে 2 মাস অপেক্ষা করতাম। কারণটি হ'ল কিছু অতি জ্ঞানী লোকের খুব ভারী তফসিল থাকে এবং কয়েক সপ্তাহ পরে তাদের (সাধারণত সেরা) উত্তর দেওয়ার জন্য কেবল সময় পাওয়া যায়। সুতরাং আমি সর্বদা তাদের কাছে থামার অপেক্ষা করা ঠিক সম্মানজনক মনে করি। ঠিক আছে, এবং যদি তারা সত্যিই তা না করে তবে আমি অবশ্যই চেকমার্কটিতে আঘাত করতে দ্বিধা করব না। এ ছাড়া, আমি দেখছি না যে কিছু লোক কেন সবসময় এসই + এর স্বাদে এত তাড়াতাড়ি থাকে। সহজ করে তোলে, ভাল। বন্দুক লাফানো না। :) এটি আপনার বস আপনার উপর চাপ দিচ্ছে না।
সিনট্যাক্সেরর

10

অতিরিক্তভাবে, আপনি যদি ভবিষ্যতে সাধারণত দুর্ঘটনাজনিত ওভাররাইটগুলি এড়াতে চান, তবে এর -iবিকল্প রয়েছে mv। আপনি ব্যক্তিগতভাবে আমি কোনও ত্রুটিগুলি সম্পর্কে ভাবতে পারি না

alias mv='mv -i'

এরপরে যদি আপনার কোনও কিছু ওভাররাইট করতে হয় তবে কেবল -fবিকল্পটি পাস করুন ।

উপস্থাপনাগুলি তখনই কার্যকর হয় যদি আপনি সরাসরি ইন্টারেক্টিভ শেলের মধ্যে কমান্ডটি টাইপ করেন, দ্বারা অনুরোধের মতো ক্ষেত্রে নয় find। আপনি চালাতে পারে

find . -name '* 9?.mp3' -exec mv -i {} 90 \;

এবং তারপরে mvকোনও বিদ্যমান ফাইলটি ওভাররাইট করার চেষ্টা করে থাকলে আপনাকে জিজ্ঞাসা করা হত ।


4
অথবা - আপনি সম্ভবত জানেন না - এর পরিবর্তে ´ \ mv type টাইপ করুন mv। এই কম পরিচিত "কৌতুক" ব্যাকস্ল্যাশ দ্বারা প্রিপেন্ড করা কমান্ডকে কোনও উপস সংজ্ঞা উপেক্ষা করার কারণ ঘটায় ।
সিনট্যাক্সারর

অবশ্যই, যদি আপনি সত্যিই কথা বলছেন find ... -exec mv ...তবে আপনাকে নিজের ~/bin/mv(বা অন্য কোনও উপযুক্ত ডিরেক্টরি) তৈরি করতে হবে এবং তা করাতে হবে /bin/mv -i "$@"- কারণ find ... -execএলিয়াসগুলি তাকান না।
জি-ম্যান

এই ক্ষেত্রে, আমি পছন্দ করি env mv। কম টাইপিং। :) যেহেতু আমার স্থানীয় কীবোর্ড লেআউটটির জন্য শিফট কীটি একটি ফরোয়ার্ড স্ল্যাশের জন্য চাপতে হবে, আমি সর্বদা "স্ল্যাশ-কম" সংস্করণগুলির পক্ষে (যদি প্রযোজ্য হয়) পছন্দ করি।
সিনট্যাক্সেরর

1
@ স্যানট্যাক্সেরর: বিটিডাব্লু, আপনি যখন মন্তব্যে প্রতিক্রিয়া জানালেন (নতুন মন্তব্যে), তখন "@ জি-ম্যান" এর মতো "@" এর আগে লেখকের নাম উল্লেখ করা প্রচলিত। এইভাবে আমি অবহিত হই। (আমি আপনার শেষ মন্তব্যে আধা-সময়মত প্রতিক্রিয়া জানাতে পেরেছিলাম কারণ জেনি ডি-র মন্তব্যে আমি বিজ্ঞপ্তি পেয়েছি You) আপনি সংক্ষিপ্ত করতে বা পুরো নামটি (ফাঁকা ছাড়াই) ব্যবহার করতে পারেন, যেমন, "@ স্টাফেনচেজেলাস"। কোনও পোস্টের লেখক স্বয়ংক্রিয়ভাবে সেই পোস্টে মন্তব্যে অবহিত হন। এই সহায়তা পৃষ্ঠার মন্তব্য অনুচ্ছেদে জবাব দেখুন ।
জি-ম্যান

1
আমি দুঃখিত, আমি এক দিনের জন্য ইন্টারনেট-কম ছিলাম। @ জি-ম্যান আমি একমত যে mvএর শুরুতে কোনও স্থানে একটি ব্যক্তিগত সংস্করণ $PATHথাকা একটি পরিষ্কার সমাধান হতে পারে। অন্যদিকে আমি প্রাথমিকভাবে mvইন্টারেক্টিভ শেলটিতে অযত্নে ঘটে (কারণ এটি দ্রুত ঘটে)। যে মুহূর্তে আমি আরও জটিল কিছু রচনা করলাম, যেমন findবা forলুপ বা শেল স্ক্রিপ্ট, আমি কিছু শুকনো রান (ব্যবহার করে echo) করার চেষ্টা করি যাতে আমি কিছু ভঙ্গ না করি। এই ক্ষেত্রে আমার কোনও হাত ধরে রাখার দরকার নেই mv, কারণ আমি ইতিমধ্যে এর মধ্যে কিছু চিন্তা রাখছি।
আয়কাত

7

উপরের চমৎকার উত্তরের পাশাপাশি, আমি পরিষ্কার করতে চাই যে আপনি ফাইলগুলি স্থানান্তরিত করবেন কি করবেন না সে সম্পর্কে প্রশ্ন কেন পেলেন না।

আপনি যদি একটি ফাইলকে নতুন নামে সরিয়ে নিয়ে যান এবং সেই নামটি কোনও ডিরেক্টরি নয় তবে mvআপনার ফাইলটির নতুন নামকরণ করবেন।

এখানে ইস্যু আপনার ব্যবহার করা হয়েছে findচালানো mvএকবার ফাইল প্রতি , না একবার সব ফাইল

যদি এর পরিবর্তে, আপনি কাজটি করেন mv *90.mp3 90, তবে mv"টার্গেট ফাইল ডিরেক্টরি নয়" ত্রুটি বার্তাটি দিয়ে ব্যর্থ হত।

পরামর্শের আরেকটি অংশ হ'ল টার্গেট পাথ টাইপ করার সময় ট্যাব সমাপ্তি ব্যবহার করা। এটি /লক্ষ্যবস্তুটির নামের সাথে যুক্ত করে লক্ষ্য নির্দেশিকা কিনা তা আপনাকে দেখায় । আপনি mv -iকোনও বিদ্যমান ফাইল ওভাররাইট করতে চান কিনা তা জিজ্ঞাসা করার জন্যও আপনি ব্যবহার করতে পারেন।


যদি এর পরিবর্তে আপনি কাজটি করেন mv *90.mp3 90তবে এমভি "ত্রুটিযুক্ত বার্তাটি" টার্গেট ফাইলটি ডিরেক্টরি নয় "দিয়ে ব্যর্থ হয়ে যেত। হাহ, হ্যাঁ, এত জটিল কেন? আমি আপনার লাইনটি ব্যবহার করি এবং আমি খুশি হব। যদিও এই তুচ্ছ মামলায়। :) কারণ আমি আমার প্রশ্ন জিজ্ঞাসা করার এটাই স্বাভাবিক উপায়: সরলতার জন্য আমি এগুলি সংকীর্ণ করতাম। findএখন পর্যন্ত কেউই আপত্তি করেনি যে 90 এর ফাইলগুলি পাশাপাশি বিভিন্ন সাব-ডিরেক্টরিতে ছড়িয়ে ছিটিয়ে থাকতে পারে যা আমিও "ধরতে" চাই। যদি এবং শুধুমাত্র যদি তারা সর্বদা একটি উত্স ডিরেক্টরিতে থাকে তবে আপনার mvলাইনটি প্রযোজ্য।
সিনট্যাক্সেরর

@ সাইন্ট্যাক্সেরর খুব সত্য - আমি এটি কীভাবে mvআচরণ করে তার উদাহরণ হিসাবে বোঝানো হয়েছিল , আপনার সরঞ্জামগুলির পছন্দগুলির সমালোচনা হিসাবে নয়।
জেনি ডি

1
আপনি সম্ভবত কিছু সংমিশ্রণ তৈরি করতে পারেন findএবং mv, উদাহরণস্বরূপ find /music -type d -exec mv {}/*90.mp3 targetdir\;- তবে এখন আমি কিছুটা অনুভব করছি যে আমি এটিকে অত্যধিক জটিল করে তুলছি, এবং কেবল ব্যবহার করছি -iবা -tআরও দক্ষ
জেনি ডি

1
@ জেনি: যদি আপনার find . -type d -exec mv {}/*9?.mp3 target \;উদাহরণটি কাজ করে, তবে mvকমান্ডটি এমন একটি ঝুঁকি থাকতে পারে যে mv file targetকেবলমাত্র একটি *9?.mp3ফাইল রয়েছে এমন প্রতিটি ডিরেক্টরিতে কমান্ডটি দেখতে পাবে ; সুতরাং এই জাতীয় সমস্ত ফাইল (শেষটি ব্যতীত) হারিয়ে যাবে।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

4
@ সাইন্ট্যাক্সেরর: পুরো ৪২,০০০ লাইন স্ক্রিপ্ট যেখানে ঘটেছিল তার চেয়ে আপনার সমস্যার প্রয়োজনীয় অংশটি প্রকাশ করার জন্য আমি আপনার প্রচেষ্টাকে প্রশংসা করি। তবে, আপনি যদি *.mp3কোনও ডিরেক্টরি ট্রিতে সমস্ত ফাইলের জন্য কিছু করতে চান না , আপনি shopt -s globstarআপনার কমান্ডটি চালাতে পারেন এবং তারপরে **/*.mp3- এটি **একটির মতো কাজ করবে find
জি-ম্যান

1

একটি বিকল্প সাধারণ উদ্দেশ্যে কৌশল হিসাবে আমি এই ধরণের অপারেশনটিকে একটি অস্থায়ী স্ক্রিপ্টে রূপান্তর করতে পরামর্শ দিতে চাই। আমি ফলাফলগুলি দেখতে findএবং এগুলি mvহাতে কমান্ডে পরিণত করতে পছন্দ করি, এটি নিশ্চিত করে যে মৃত্যুদন্ড কার্যকর করার আগে আমি কী করছি understand যেমন।

find . -name '* 9?.mp3' > tmp
vim tmp

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

  • ফাইলের সামগ্রীগুলি এক লাইনে রাখুন: ggVGJ
  • শুরুতে যোগ: Imv [esc]
  • সংযুক্ত করুন: Asomedir/ [esc]
  • ফাইলটি সংরক্ষণ করুন। এটি আবার পড়ুন। শ্বাস নাও.
  • সম্পাদন source tmpকমান্ড লাইন।

এটি একটি রক্ষণশীল কৌশল, তবে আমাকে প্রায়শই ভুল টাইপ -execবা sedকমান্ড দ্বারা, বা ভুল বুঝে শেলের বিস্তৃতি দ্বারা দংশিত করা হয়েছে এবং আমি ধীরে ধীরে সামঞ্জস্যপূর্ণ পদ্ধতি গ্রহণ করা পছন্দ করি।

অন্য কথায়: আমি ব্যবহারের জন্য খুব কাপুরুষোচিত -exec


1
আপনি :%s/.*/"&"/পদক্ষেপটি রেখে গেছেন - কারণ এই ক্ষেত্রে, আপনি জানেন যে প্রতিটি ফাইলের নামেই কমপক্ষে একটি জায়গা থাকে।
জি-ম্যান

1
যদি ফাইলের নামগুলিতে ফাঁকা জায়গা বা অন্যান্য বিশেষ অক্ষর থাকে তবে এটি আপনাকে কামড় দেবে। আপনার এগুলি সঠিকভাবে উদ্ধৃত করা দরকার। কমান্ডের একটি তালিকা পর্যালোচনা ত্রুটিগুলি ধরা সম্ভবত না। কমান্ডগুলি চালনার আগে পর্যালোচনা করার আরও অনেক ভাল উপায় আছে যেমন echo mvপরিবর্তে চালানো mvএবং তারপরে echoআপনি খুশি থাকলে মুছে ফেলুন ।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

ফাঁকা জায়গাগুলির সাথে ফাইলের নামের মতো একটি ভুল স্পট করা এই কৌশলটি :
টম রিস

0

অন্য বিকল্প:

-n, --no-Clobber কোনও বিদ্যমান ফাইল ওভাররাইট করে না

এটি -i হিসাবে একই, তবে এটি জিজ্ঞাসা করবে না, এটি ব্যর্থ হবে।

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