কীভাবে সমস্ত ডিরেক্টরি বর্তমান ডিরেক্টরি থেকে উচ্চ ডিরেক্টরিতে স্থানান্তরিত করবেন?


133

বর্তমান ডিরেক্টরি থেকে সমস্ত ফাইলগুলিকে লিনাক্সের উপরের ডিরেক্টরিতে কীভাবে স্থানান্তরিত করবেন?

আমি এরকম কিছু চেষ্টা করেছিলাম mv *.*, কিন্তু কাজ করে না।


প্রশ্নগুলি পুনরায় চালু করার মতো পর্যাপ্ত পরিমাণে আমার কাছে নেই, তবে আমি কি প্রস্তাব দিতে পারি [linux] [mv] [cwd] [files]বা এরকম কিছু?
স্টেফান202

আমি এই প্রশ্নটি স্টেফান ২০২ এর অনুরোধ অনুসারে ফিরিয়ে দিয়েছি।
এগারোটি 1 ই

উত্তর:


202

আপনি যে আদেশটি সন্ধান করছেন তা হ'ল

mv * .[^.]* ..

বা (আরও তথ্যের জন্য নীচে দেখুন):

(shopt -s dotglob; mv -- * ..)

ব্যাখ্যা: mvকমান্ড ফাইল এবং ডিরেক্টরি সরায়। শেষ যুক্তিটি mvহ'ল লক্ষ্য (এই ক্ষেত্রে ডিরেক্টরিটি গাছের এক ধাপ "উপরে" ..)। তার আগে যুক্তিগুলি হ'ল উত্স ফাইল এবং ডিরেক্টরি। অ্যাসিটার্ক ( *) একটি ওয়াইল্ডকার্ড যা সমস্ত ফাইলের সাথে মেলে যা কোনও বিন্দু দিয়ে শুরু হয় না। ডট (ডটফাইল) দিয়ে শুরু হওয়া ফাইলগুলি "লুকানো" থাকে। তারা প্যাটার্ন ব্যবহার করে মিলছে .[^.]*(নীচে সম্পাদনা দেখুন)।

আরও তথ্যের জন্য আমি যে ম্যানপেজটি সংযুক্ত করেছি তা দেখুন mv


এর .[^.]*বদলে কেন .*?

হিসাবে ক্রিস জনসেন সঠিকভাবে তুলে ধরে: প্যাটার্ন .*এছাড়াও সাথে মেলে .এবং ..। যেহেতু আপনি এগুলিকে সরিয়ে নিতে (এবং না) চান না, সেই বিন্দুটি ব্যবহার করা ভাল যা এই দুটি ব্যতীত বিন্দু দিয়ে শুরু হওয়া কোনও ফাইলের সাথে মেলে । প্যাটার্ন .[^.]*শুধু যে: এটা কোন ফাইলের নাম (1) ডট (2) একটি অক্ষর যা দ্বারা অনুসরণ দিয়ে শুরু মিলে যায় না একটি বিন্দু (3) শূন্য বা তার বেশি অযৌক্তিক অক্ষরের করে।

প্যাগাস যেমন উল্লেখ করেছেন , .??*দুটি বিন্দু দিয়ে শুরু হওয়া ফাইলগুলি মেলানোর জন্য আমাদের প্যাটার্নটিও যুক্ত করতে হবে । বিকল্প উত্তর ব্যবহারের জন্য তার উত্তর দেখুন find

ডটফাইলস নিয়ে issues সমস্ত বিষয় এড়ানোর জন্য অর্জানের উত্তরে উল্লেখ shoptরয়েছে। তবে তারপরেও ফাইলগুলি ড্যাশ দিয়ে শুরু হওয়া নিয়ে সমস্যা রয়েছে। এবং এটির জন্য তিনটি কমান্ডের প্রয়োজন। তবুও, আমি ধারণাটি পছন্দ করি। আমি এটি এইভাবে ব্যবহার করার প্রস্তাব দিচ্ছি:

(shopt -s dotglob; mv -- * ..)

এটি shoptএকটি সাবশেলে চালিত হয় (সুতরাং দ্বিতীয় কলটি shoptআবশ্যক নয়) এবং --ড্যাশ দিয়ে শুরু হওয়া ফাইলগুলিকে আর্গুমেন্ট হিসাবে ব্যাখ্যা করা যায় না তাই ব্যবহার করে mv


7
ব্যবহার .*কারণ হতে পারে এমভি না সরাতে সক্ষম হচ্ছে সম্পর্কে সতর্কবার্তা / ত্রুটি উত্পাদন করতে .এবং ..mv * .[^.]* ..পরিবর্তে আপনি চেষ্টা করতে পারেন।
ক্রিস জনসেন

1
@ আলাইন: আপনাকে স্বাগতম, এবং সাইটে আপনাকে স্বাগতম! (যদি (এবং কেবলমাত্র যদি) পোস্টগুলির মধ্যে একটি আপনার প্রশ্নের যথেষ্ট উত্তর দেয় তবে আপনি এটির মতো চিহ্নিত করতে পারেন That এটি পোস্টারটি 15 অতিরিক্ত খ্যাতি পয়েন্ট পেতে এবং আপনাকে 2 জন অতিরিক্ত অতিরিক্ত দেবে))
স্টিফান202

আমি সত্যিই
শপ সমাধানটি

2
* * * সিনট্যাক্স - এর সাথে কোনও ক্ষতি নেই কেবলমাত্র chmod এবং chown এবং "recurse" পতাকা, অর্থাৎ chmod -R বা chown -R এর সাথে ব্যবহার করা হলে এটি বিপজ্জনক। এবং এই ক্ষেত্রে, কখনও চাউন টাইপ করবেন না * * বা chmod। * - আপনি যে পথে সন্ধান করছেন এবং hh ব্যবহার করেন তার উপরের ডিরেক্টরিটি ছাঁটাই (প্রতীকী লিঙ্কগুলি অনুসরণ করবেন না)। কিন্তু, এমভি .. সহজভাবে কিছু করে না তাই এটি নিয়ে চিন্তা করবেন না।
খ্রিস্ট

1
সঠিক তিনটি নিদর্শনগুলি হ'ল *, .[^.]*এবং ..?*। দ্বিতীয় সম্ভবত .[!.]*পুরানো (পসিক্স) শাঁসের জন্য। আরও পড়ুন

42

সংক্ষিপ্ত উত্তর: ব্যবহার

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

দীর্ঘ উত্তর:

আদেশ

mv * .* ..

.*মেলে .এবং করতে পারে কাজ করে না ..। কিন্তু আদেশ

mv * .[^.]* ..

কাজ .[^.]*করবে না , যেহেতু মিলবে না, যেমন ..filename! পরিবর্তে, আমি কি করি is

mv * .[^.] .??* ..

যা ছাড়া সবকিছু ম্যাচ হবে .এবং ..*সবকিছু যে একটি শুরু হয় না ম্যাচ হবে ., .[^.]সব 2 অক্ষর ছাড়া একটি ডট দিয়ে শুরু ফাইলের নামের ম্যাচ হবে .., এবং .??*অন্তত 3 টি অক্ষর সঙ্গে একটি ডট দিয়ে শুরু সব ফাইলের নামের ম্যাচ হবে।

আরও ভাল, আপনি ব্যবহার করতে পারেন

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

যা কুৎসিত গ্লোব হ্যাকগুলিকে এড়িয়ে চলে mv * .[^.] .??* ..!


1
এছাড়াও, আমি এর গুরুত্বটি নোট করতে ভুলে গিয়েছিলাম - যাতে ড্যাশ দিয়ে শুরু হওয়া ফাইলের নাম দিয়ে কমান্ডটি সঠিকভাবে কাজ করে। আমি অন্তর্ভুক্ত করেছি - যদিও আমার সন্ধানের উত্তরটিতে। গ্লোব ব্যবহার করে আরও সম্পূর্ণ উত্তর হ'ল "এমভি - *। [^।]। ?? * .." "
প্যাগাস 20

+1: আমি ..?*আমার মন্তব্যে যোগ করতে ফিরে এসেছি এবং আপনি ইতিমধ্যে এটি যত্ন করে রেখেছিলেন।
ক্রিস জনসেন

1
এমভি করার চেষ্টা করে কী ভুল হতে পারে ..? এটি কেবল কিছুই করে না এবং কিছুই করতে পারে না। অন্যান্য কমান্ড রয়েছে যেখানে এটি কিছু করতে পারে (chmod এবং chown) তবে এমভি এবং আরএম কেবল কিছুই করতে পারে না। বা ..
খ্রিস্ট

1
এটি
এমভি

1
তবে, ডাবল ড্যাশগুলি mvআরও কোনও কমান্ড বিকল্পের সন্ধান বন্ধ করতে বলে । বন্ধনীগুলি ফলস্বরূপ ফাইলের নাম are প্লাস চিহ্নটি ফলাফল হিসাবে এক্সিকিউটিভ চালানোর পরিবর্তে (যেমন ফাইলের নাম হিসাবে) বলেছে, যতটা সম্ভব একক এক্সিকিউরে যতটা ফলাফল রাখা যায়। সম্পূর্ণতার জন্য, -t..লক্ষ্যযুক্ত গন্তব্যটিকে এই সমস্ত ফাইলগুলিতে স্থানান্তর করতে বলছে।
isuldor

14

কেবলমাত্র সম্পূর্ণতার জন্য, কেউ বাশ শেলকে লুকিয়ে থাকা ফাইলগুলি অন্তর্ভুক্ত করতে বলতে পারেন shopt:

shopt -s dotglob
mv -- * ..
shopt -u dotglob

+1 টি। অনেক ক্লিনার যদিও আমি মনে করি সামান্য উন্নতি ঠিক আছে। আমার উত্তরের আপডেটটি দেখুন।
স্টেফান202

8

এমভি ব্যবহার করার সময় লুকানো ফাইলগুলি সরানোর কার্যকারিতা অভাবী হয় *- তবে কেন তার পরিবর্তে অনুলিপি ব্যবহার করবেন না?

cp -rf . ..

rm -rf *

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


সতর্কতা যদি আপনি একই ফাইল সিস্টেমে চলে যান তবে সবচেয়ে বড় ক্ষেত্রে আপনি ফাইলগুলি সত্যই অনুলিপি করেননি তবে কেবল ইনড বা ফাইলের বিষয়বস্তু না সরিয়ে ডিরেক্টরি সূচীগুলি আপডেট করেন। এমনকি দেখুন [1 ]। একটি সঙ্গে cpএবং rmএর পরিবর্তে আপনি সত্যিই সব কপি হয়।
হাস্তুর

6
rsync -a --remove-source-files . ..

rsync একটি অত্যন্ত শক্তিশালী ফাইল অনুলিপি সরঞ্জাম, সাধারণত দক্ষ বর্ধমান দূরবর্তী ব্যাকআপ এবং আয়না সম্পাদনের জন্য ব্যবহৃত হয়।

উপরোক্ত কমান্ডের সঙ্গে, আমরা বলছেন rsyncবিষয়বস্তু কপি করার .মধ্যে..

স্যুইচটি সাব-ডিরেক্টরিতে -aপুনরাবৃত্তি সক্ষম করে .এবং কিছু অন্যান্য সাধারণ বিকল্পকে সক্ষম করে।

স্যুইচটি --remove-source-filesএকটি সফল অনুলিপি করার পরে সোর্স ফাইলগুলি মুছে ফেলার জন্য আরএসসিএনকে বলে, এটি mvকমান্ডের সাথে একইভাবে আরএসসিএনকে আচরণ করে ।


1
আরেকটু ব্যাখ্যা ভাল লাগবে।
ChrisF

অবশ্যই, আশা করি এটি এখন আরও পরিষ্কার।
মুর্চি

দ্রষ্টব্য যে --remove-source-filesডিরেক্টরিগুলি (সিঙ্ক্রোনাইজড) সরাবে না।
ডেনিস

ভাল, গৃহীত সমাধান আমাকে -bash: /bin/mv: Argument list too longত্রুটি দেয় । এই এক কবজ মত কাজ করে।
ইউজারলন্ড

2

চূড়ান্তভাবে চেষ্টা mv .করা ব্যর্থ হবে কারণ mv * ..এমভি আপনার বর্তমানে থাকা ডিরেক্টরিটিকে লিঙ্কমুক্ত করতে সক্ষম হবে না You আপনি সিডব্লুতে ফাইলগুলি সরাতে পারবেন।


2
mv * .??* ../.

*সমস্ত নট ডট ফাইল পায়। .??*সব পায় ফাইলগুলি কমপক্ষে তিন বাইট দীর্ঘ, যা সমস্ত বৈধ ব্যক্তির পক্ষে কাজ করে। কিছু বাকি আপনি সম্ভবত করতে চান rmবদলে mvযাহাই হউক না কেন।

এতে ../.কোনও সরাসরি বেনিফিট উপলব্ধ করা হয় না ..তবে কোনও মুভ-টু-ডিরেক্টরি করার সময় এটি প্রবেশ করা খুব ভাল অভ্যাস, কারণ এটি যেমন আপনি চান, ব্যর্থ হবে, যদি পথে কোনও সমস্যা থাকে। উদাহরণস্বরূপ, mv xyz bletchআপনি যেখানে ডিরেক্টরি মনে করেন সেখানে bletchআরও নির্দিষ্ট করে নির্দিষ্ট করা যেতে পারে mv xyz bletch/.


2
আপনি .[^.]কভার ফাইল পেতে যোগ করতে পারেন .a
ক্রিস জনসন

../ এবং ../ এর মধ্যে কোনও পার্থক্য নেই। তাই আমি টাইপ করতে বিরক্ত করব না। স্ল্যাশ পরে। এছাড়াও, এমভি এবং আরএম এর ক্ষেত্রে এটি অন্তর্ভুক্ত করার কোনও ক্ষতি করে না। এবং .. তালিকায়, অর্থাত্ এমভি *। * / পাথ / থেকে / ফাইল / এর সাথে কোনও ভীতিজনক বা ভুল কিছুই নেই, ঠিক আরএম হিসাবে। বা এমনকি -আরএফ। কিছু করে না
খ্রিস্ট

2

এই মিনিমাইজ করা কমান্ডটি বেশিরভাগ আধুনিক শেলগুলিতে কাজ করে:

\mv -- {,.{[^.],??}}* ..

অন্যথায় উল্লিখিত একটি বহনযোগ্য সমাধান:

\mv -- * .[^.] .??* ..

বৈশিষ্ট্য:

  1. m অনাকাঙ্ক্ষিতভাবে এমভি পরিবর্তন করা থেকে এলিয়াসগুলি প্রতিরোধ করে।

  2. - নেতৃস্থানীয় হাইফেন (-xyz) ধারণকারী ফাইলের নামগুলি কমান্ড-লাইন আর্গুমেন্ট হিসাবে ব্যাখ্যা করা থেকে বাধা দেয়।

  3. । [^।] দুটি অক্ষরের ফাইলের নামের সাথে শুরু হয় matches বাদে ..

  4. । ?? * অন্য সমস্ত ফাইলের নামের সাথে তিনটি অক্ষর বা তারও বেশি মেলে।

নিষ্পাপ বাস্তবায়ন:

  1. নিম্নলিখিত স্কিপগুলি লুকানো ইউনিক্স ফাইলের নামগুলি দিয়ে শুরু করে। (.Bashrc)।

    mv * ..
    
  2. নিম্নলিখিত ম্যাচগুলি .. যা প্রত্যক্ষভাবে প্রতিটি ডিরেক্টরিকে চলমান চলমান ডিরেক্টরি ($ পিডাব্লুডি বা পিডাব্লুডি) - এর সমস্ত পথে শেষ পর্যন্ত সরিয়ে নেওয়ার চেষ্টা করে। কখনও ব্যবহার করবেন না।

    mv .* ..
    

2

প্রাক্তনটি ksh88 এর মতো পুরানো শেলগুলির সাথেও কাজ করবে তার * .[!.] .??*চেয়ে প্যাটার্নটি ব্যবহার করা আরও সঠিক * .[^.] .??*:

mv -- * .[!.] .??* ..
  • -- আপনার যখন কোনও ফাইল নাম শুরু হয় তখন সমস্যাগুলি প্রতিরোধ করে -
  • * সমস্ত ফাইল নামের সাথে মেলে যা একটি দিয়ে শুরু হয় না .
  • এমন কোনও অক্ষরের ফাইলের নাম নেই যা দিয়ে .আপনি শুরু করতে পারেন / শুরু করতে পারেন with
  • .[!.] সমস্ত দুটি অক্ষরের ফাইলের নামের সাথে মেলে যা একটি দিয়ে শুরু হয় .
  • .??* তিনটি অক্ষরের ফাইলের নামের সাথে (বা তার বেশি) মিলবে যা a দিয়ে শুরু হয় .

Ksh88 এর সাহায্যে ফাইল নামের প্যাটার্নটি .[^.]প্রকৃতপক্ষে ফাইলের নামের সাথে মিলবে ..(যা সর্বদা বিদ্যমান) এবং .^(যা সম্ভবত উপস্থিত নেই) যা পছন্দসই তার বিপরীতে প্রভাব ফেলে।


0

কাজটিও গ্রেপ করুন এবং গ্রেপ করুন। আপনি যদি অনুসন্ধান এবং উদাহরণস্বরূপ পরিবর্তন করে আরও জটিল মানদণ্ডে ফাইলগুলি নির্বাচন করতে চান তবে এই ধরণের কাঠামোটি সহায়ক হতে পারে।

find -maxdepth 1 | egrep '^./.'         # Returns all files

mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..

0

আমি মনে করি সমস্ত ফাইলকে এর পিতামহীর দিকে নিয়ে যাওয়ার সহজ সমাধান। হবে

mv "`ls`" ../

বা, যদি লুকানো ফাইল / ডিরেক্টরি থাকে

ব্যবহার করুন:

mv "`ls -a`" ../ 2>/dev/null

এছাড়াও, যাক আপনি কিছু ফোল্ডারের সামগ্রীগুলি তার অভ্যন্তরীণ ফোল্ডারের কোনওটিতে স্থানান্তরিত করতে চান (বলুন)

ব্যবহার করুন:

mv "`ls -a`" /tony 2>/dev/null

বিঃদ্রঃ:

"`ls -a`" 

এতে ফাঁকা থাকা ফাইলগুলিকে সরাতে।

2>/dev/null

সতর্কতা / ত্রুটি দমন করার জন্য কারণ ls -aএটি ...ফোল্ডারটিও মুদ্রণ করে এবং আপনি সেগুলি সরাতে বা অনুলিপি করতে পারবেন না। সুতরাং এই ফোল্ডারগুলির জন্য এটি ত্রুটি প্রদর্শন করবে (যদি আমরা 2> / dev / নাল ব্যবহার না করি) যে এটি তাদের সরিয়ে নিতে পারে না এবং বাকীগুলি বেশ আরামে সরানো হবে।

ls -aকোনও লুকানো ফাইল নেই এবং কেবল ব্যবহার না করা এড়াতে সেরা ls


আপনি চেষ্টা করেছেন আপনি দৌড়ানোর সময় কি ঘটবে mv $(ls -a)? এটি বর্তমান ডিরেক্টরি এবং এটির নীচে ডিরেক্টরিতে ট্যাপ করবে, কারণ ls -aআউটপুটও হবে ..
সামি লাইন

ধন্যবাদ, @ সামিলেইনের পরামর্শের জন্য আমি সংশোধন করেছি। তবে mv ls -a ../প্রয়োজন অনুসারে কাজও করতেন, হ্যাঁ এটি আমার উপরে উল্লিখিত হিসাবে এই ত্রুটিগুলি প্রদর্শন করবে তবে এটি প্রয়োজনীয় ফোল্ডারগুলি / ফাইলগুলি পিতামাতার দিরে স্থানান্তরিত করবে।
প্রভাত কুমার সিং

এটি স্পেস সহ ফাইলগুলির জন্য কাজ করবে না।
কেনারব

@ কেনারবকে lsফাঁকা স্থান সহ ফাইলগুলি সরানোর জন্য আপনাকে কমান্ডের দ্বিগুণ উদ্ধৃতি দিতে হবে। আমি প্রয়োজনীয় পরিবর্তন করেছি। নির্দেশ করার জন্য ধন্যবাদ।
প্রভাত কুমার সিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.