বর্তমান ডিরেক্টরি থেকে সমস্ত ফাইলগুলিকে লিনাক্সের উপরের ডিরেক্টরিতে কীভাবে স্থানান্তরিত করবেন?
আমি এরকম কিছু চেষ্টা করেছিলাম mv *.*
, কিন্তু কাজ করে না।
বর্তমান ডিরেক্টরি থেকে সমস্ত ফাইলগুলিকে লিনাক্সের উপরের ডিরেক্টরিতে কীভাবে স্থানান্তরিত করবেন?
আমি এরকম কিছু চেষ্টা করেছিলাম mv *.*
, কিন্তু কাজ করে না।
উত্তর:
আপনি যে আদেশটি সন্ধান করছেন তা হ'ল
mv * .[^.]* ..
বা (আরও তথ্যের জন্য নীচে দেখুন):
(shopt -s dotglob; mv -- * ..)
ব্যাখ্যা: mv
কমান্ড ফাইল এবং ডিরেক্টরি সরায়। শেষ যুক্তিটি mv
হ'ল লক্ষ্য (এই ক্ষেত্রে ডিরেক্টরিটি গাছের এক ধাপ "উপরে" ..
)। তার আগে যুক্তিগুলি হ'ল উত্স ফাইল এবং ডিরেক্টরি। অ্যাসিটার্ক ( *
) একটি ওয়াইল্ডকার্ড যা সমস্ত ফাইলের সাথে মেলে যা কোনও বিন্দু দিয়ে শুরু হয় না। ডট (ডটফাইল) দিয়ে শুরু হওয়া ফাইলগুলি "লুকানো" থাকে। তারা প্যাটার্ন ব্যবহার করে মিলছে .[^.]*
(নীচে সম্পাদনা দেখুন)।
আরও তথ্যের জন্য আমি যে ম্যানপেজটি সংযুক্ত করেছি তা দেখুন mv
।
.[^.]*
বদলে কেন .*
?হিসাবে ক্রিস জনসেন সঠিকভাবে তুলে ধরে: প্যাটার্ন .*
এছাড়াও সাথে মেলে .
এবং ..
। যেহেতু আপনি এগুলিকে সরিয়ে নিতে (এবং না) চান না, সেই বিন্দুটি ব্যবহার করা ভাল যা এই দুটি ব্যতীত বিন্দু দিয়ে শুরু হওয়া কোনও ফাইলের সাথে মেলে । প্যাটার্ন .[^.]*
শুধু যে: এটা কোন ফাইলের নাম (1) ডট (2) একটি অক্ষর যা দ্বারা অনুসরণ দিয়ে শুরু মিলে যায় না একটি বিন্দু (3) শূন্য বা তার বেশি অযৌক্তিক অক্ষরের করে।
প্যাগাস যেমন উল্লেখ করেছেন , .??*
দুটি বিন্দু দিয়ে শুরু হওয়া ফাইলগুলি মেলানোর জন্য আমাদের প্যাটার্নটিও যুক্ত করতে হবে । বিকল্প উত্তর ব্যবহারের জন্য তার উত্তর দেখুন find
।
ডটফাইলস নিয়ে issues সমস্ত বিষয় এড়ানোর জন্য অর্জানের উত্তরে উল্লেখ shopt
রয়েছে। তবে তারপরেও ফাইলগুলি ড্যাশ দিয়ে শুরু হওয়া নিয়ে সমস্যা রয়েছে। এবং এটির জন্য তিনটি কমান্ডের প্রয়োজন। তবুও, আমি ধারণাটি পছন্দ করি। আমি এটি এইভাবে ব্যবহার করার প্রস্তাব দিচ্ছি:
(shopt -s dotglob; mv -- * ..)
এটি shopt
একটি সাবশেলে চালিত হয় (সুতরাং দ্বিতীয় কলটি shopt
আবশ্যক নয়) এবং --
ড্যাশ দিয়ে শুরু হওয়া ফাইলগুলিকে আর্গুমেন্ট হিসাবে ব্যাখ্যা করা যায় না তাই ব্যবহার করে mv
।
.*
কারণ হতে পারে এমভি না সরাতে সক্ষম হচ্ছে সম্পর্কে সতর্কবার্তা / ত্রুটি উত্পাদন করতে .
এবং ..
। mv * .[^.]* ..
পরিবর্তে আপনি চেষ্টা করতে পারেন।
*
, .[^.]*
এবং ..?*
। দ্বিতীয় সম্ভবত .[!.]*
পুরানো (পসিক্স) শাঁসের জন্য। আরও পড়ুন
সংক্ষিপ্ত উত্তর: ব্যবহার
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
দীর্ঘ উত্তর:
আদেশ
mv * .* ..
.*
মেলে .
এবং করতে পারে কাজ করে না ..
। কিন্তু আদেশ
mv * .[^.]* ..
কাজ .[^.]*
করবে না , যেহেতু মিলবে না, যেমন ..filename
! পরিবর্তে, আমি কি করি is
mv * .[^.] .??* ..
যা ছাড়া সবকিছু ম্যাচ হবে .
এবং ..
। *
সবকিছু যে একটি শুরু হয় না ম্যাচ হবে .
, .[^.]
সব 2 অক্ষর ছাড়া একটি ডট দিয়ে শুরু ফাইলের নামের ম্যাচ হবে ..
, এবং .??*
অন্তত 3 টি অক্ষর সঙ্গে একটি ডট দিয়ে শুরু সব ফাইলের নামের ম্যাচ হবে।
আরও ভাল, আপনি ব্যবহার করতে পারেন
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
যা কুৎসিত গ্লোব হ্যাকগুলিকে এড়িয়ে চলে mv * .[^.] .??* ..
!
..?*
আমার মন্তব্যে যোগ করতে ফিরে এসেছি এবং আপনি ইতিমধ্যে এটি যত্ন করে রেখেছিলেন।
mv
আরও কোনও কমান্ড বিকল্পের সন্ধান বন্ধ করতে বলে । বন্ধনীগুলি ফলস্বরূপ ফাইলের নাম are প্লাস চিহ্নটি ফলাফল হিসাবে এক্সিকিউটিভ চালানোর পরিবর্তে (যেমন ফাইলের নাম হিসাবে) বলেছে, যতটা সম্ভব একক এক্সিকিউরে যতটা ফলাফল রাখা যায়। সম্পূর্ণতার জন্য, -t..
লক্ষ্যযুক্ত গন্তব্যটিকে এই সমস্ত ফাইলগুলিতে স্থানান্তর করতে বলছে।
কেবলমাত্র সম্পূর্ণতার জন্য, কেউ বাশ শেলকে লুকিয়ে থাকা ফাইলগুলি অন্তর্ভুক্ত করতে বলতে পারেন shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
এমভি ব্যবহার করার সময় লুকানো ফাইলগুলি সরানোর কার্যকারিতা অভাবী হয় *
- তবে কেন তার পরিবর্তে অনুলিপি ব্যবহার করবেন না?
cp -rf . ..
rm -rf *
ডটগ্লাবিং এবং ফাইন্ড কমান্ড ব্যবহার করে জটিল সমাধানগুলিতে প্রবেশ করার দরকার নেই।
rsync -a --remove-source-files . ..
rsync
একটি অত্যন্ত শক্তিশালী ফাইল অনুলিপি সরঞ্জাম, সাধারণত দক্ষ বর্ধমান দূরবর্তী ব্যাকআপ এবং আয়না সম্পাদনের জন্য ব্যবহৃত হয়।
উপরোক্ত কমান্ডের সঙ্গে, আমরা বলছেন rsync
বিষয়বস্তু কপি করার .
মধ্যে..
স্যুইচটি সাব-ডিরেক্টরিতে -a
পুনরাবৃত্তি সক্ষম করে .
এবং কিছু অন্যান্য সাধারণ বিকল্পকে সক্ষম করে।
স্যুইচটি --remove-source-files
একটি সফল অনুলিপি করার পরে সোর্স ফাইলগুলি মুছে ফেলার জন্য আরএসসিএনকে বলে, এটি mv
কমান্ডের সাথে একইভাবে আরএসসিএনকে আচরণ করে ।
--remove-source-files
ডিরেক্টরিগুলি (সিঙ্ক্রোনাইজড) সরাবে না।
-bash: /bin/mv: Argument list too long
ত্রুটি দেয় । এই এক কবজ মত কাজ করে।
চূড়ান্তভাবে চেষ্টা mv .
করা ব্যর্থ হবে কারণ mv * ..
এমভি আপনার বর্তমানে থাকা ডিরেক্টরিটিকে লিঙ্কমুক্ত করতে সক্ষম হবে না You আপনি সিডব্লুতে ফাইলগুলি সরাতে পারবেন।
mv * .??* ../.
*
সমস্ত নট ডট ফাইল পায়। .??*
সব পায় ফাইলগুলি কমপক্ষে তিন বাইট দীর্ঘ, যা সমস্ত বৈধ ব্যক্তির পক্ষে কাজ করে। কিছু বাকি আপনি সম্ভবত করতে চান rm
বদলে mv
যাহাই হউক না কেন।
এতে ../.
কোনও সরাসরি বেনিফিট উপলব্ধ করা হয় না ..
তবে কোনও মুভ-টু-ডিরেক্টরি করার সময় এটি প্রবেশ করা খুব ভাল অভ্যাস, কারণ এটি যেমন আপনি চান, ব্যর্থ হবে, যদি পথে কোনও সমস্যা থাকে। উদাহরণস্বরূপ, mv xyz bletch
আপনি যেখানে ডিরেক্টরি মনে করেন সেখানে bletch
আরও নির্দিষ্ট করে নির্দিষ্ট করা যেতে পারে mv xyz bletch/.
।
.[^.]
কভার ফাইল পেতে যোগ করতে পারেন .a
।
এই মিনিমাইজ করা কমান্ডটি বেশিরভাগ আধুনিক শেলগুলিতে কাজ করে:
\mv -- {,.{[^.],??}}* ..
অন্যথায় উল্লিখিত একটি বহনযোগ্য সমাধান:
\mv -- * .[^.] .??* ..
বৈশিষ্ট্য:
m অনাকাঙ্ক্ষিতভাবে এমভি পরিবর্তন করা থেকে এলিয়াসগুলি প্রতিরোধ করে।
- নেতৃস্থানীয় হাইফেন (-xyz) ধারণকারী ফাইলের নামগুলি কমান্ড-লাইন আর্গুমেন্ট হিসাবে ব্যাখ্যা করা থেকে বাধা দেয়।
। [^।] দুটি অক্ষরের ফাইলের নামের সাথে শুরু হয় matches বাদে ..
। ?? * অন্য সমস্ত ফাইলের নামের সাথে তিনটি অক্ষর বা তারও বেশি মেলে।
নিষ্পাপ বাস্তবায়ন:
নিম্নলিখিত স্কিপগুলি লুকানো ইউনিক্স ফাইলের নামগুলি দিয়ে শুরু করে। (.Bashrc)।
mv * ..
নিম্নলিখিত ম্যাচগুলি .. যা প্রত্যক্ষভাবে প্রতিটি ডিরেক্টরিকে চলমান চলমান ডিরেক্টরি ($ পিডাব্লুডি বা পিডাব্লুডি) - এর সমস্ত পথে শেষ পর্যন্ত সরিয়ে নেওয়ার চেষ্টা করে। কখনও ব্যবহার করবেন না।
mv .* ..
প্রাক্তনটি ksh88 এর মতো পুরানো শেলগুলির সাথেও কাজ করবে তার * .[!.] .??*
চেয়ে প্যাটার্নটি ব্যবহার করা আরও সঠিক * .[^.] .??*
:
mv -- * .[!.] .??* ..
--
আপনার যখন কোনও ফাইল নাম শুরু হয় তখন সমস্যাগুলি প্রতিরোধ করে -
*
সমস্ত ফাইল নামের সাথে মেলে যা একটি দিয়ে শুরু হয় না .
.
আপনি শুরু করতে পারেন / শুরু করতে পারেন with.[!.]
সমস্ত দুটি অক্ষরের ফাইলের নামের সাথে মেলে যা একটি দিয়ে শুরু হয় .
.??*
তিনটি অক্ষরের ফাইলের নামের সাথে (বা তার বেশি) মিলবে যা a দিয়ে শুরু হয় .
Ksh88 এর সাহায্যে ফাইল নামের প্যাটার্নটি .[^.]
প্রকৃতপক্ষে ফাইলের নামের সাথে মিলবে ..
(যা সর্বদা বিদ্যমান) এবং .^
(যা সম্ভবত উপস্থিত নেই) যা পছন্দসই তার বিপরীতে প্রভাব ফেলে।
কাজটিও গ্রেপ করুন এবং গ্রেপ করুন। আপনি যদি অনুসন্ধান এবং উদাহরণস্বরূপ পরিবর্তন করে আরও জটিল মানদণ্ডে ফাইলগুলি নির্বাচন করতে চান তবে এই ধরণের কাঠামোটি সহায়ক হতে পারে।
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
আমি মনে করি সমস্ত ফাইলকে এর পিতামহীর দিকে নিয়ে যাওয়ার সহজ সমাধান। হবে
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
ফাঁকা স্থান সহ ফাইলগুলি সরানোর জন্য আপনাকে কমান্ডের দ্বিগুণ উদ্ধৃতি দিতে হবে। আমি প্রয়োজনীয় পরিবর্তন করেছি। নির্দেশ করার জন্য ধন্যবাদ।
[linux] [mv] [cwd] [files]
বা এরকম কিছু?