একটি বাদে সমস্ত ফাইল সরান


154

আমি কীভাবে একটি বাদে সব ফাইল সরিয়ে নিতে পারি? আমি এরকম কিছু খুঁজছি:

'mv ~/Linux/Old/!Tux.png ~/Linux/New/'

যেখানে আমি পুরানো স্টাফগুলি নতুন স্টাফ-ফোল্ডারে বাদে রাখি Tux.png। ! -সাইন একটি অবহেলা প্রতিনিধিত্ব করে। কাজের জন্য কোনও সরঞ্জাম আছে?

উত্তর:


142

আপনি যদি ব্যাশ ব্যবহার করেন এবং extglobশেল বিকল্প সেট থাকে (যা সাধারণত এটি হয়):

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/

1
আমি অনেকগুলি আইটেমের জন্য কমান্ডটি পরীক্ষা করার সময় আমি কিছু ভুল পেয়েছি: এমভি ~ ​​/ লিনাক্স / ওল্ড /! (Tux.png Tux1.png Tux2.png) Linux / লিনাক্স / নতুন / এটি পুরো ওল্ড-ডিরেক্টরিকে খালি করে দেয়। কি সমস্যা?
লিও লোপোল্ড হার্টজ

5
@ ইউনিক্সব্যাসিকস, চেষ্টা করুন: ~ / লিনাক্স / ওল্ড /! (Tux.png | Tux1.png | Tux2.png)
জুলিয়ানো

@ জুলিয়ানো খুব দুর্দান্ত কমান্ড! ওআর এবং এক্সওর এর মতো আরও গাণিতিক ক্রিয়াকলাপ রয়েছে কি? আমি ধরে নিই একটি পাইপ AND এর জন্য।
লিও লোপোল্ড হার্টজ

@ ইউনিক্সবাসিস, হ্যাঁ কটাক্ষপাত gnu.org/software/bash/manual/html_node/Pattern-Matching.html
Juliano

@ জুলিয়ানো আমি বরং নিদর্শনগুলি সম্পর্কে বিভ্রান্ত হয়েছি: এমভি ~ ​​/ লিনাক্স /? (টাক্স * .পিএনজি) ~ / লিনাক্স / নতুন / এমভি ~ ​​/ লিনাক্স / + (টাক্স * .পিএনজি) ~ / লিনাক্স / নতুন / পূর্ববর্তী , আমি 0-1 টাক্স-ফটো সরাতে চেয়েছিলাম। পরবর্তী সময়ে, আমি 1-n টক্স ফটো সরাতে চেয়েছিলাম। তারা সর্বত্র সরে গেছে। কেন? নির্দিষ্ট পরিমাণের ফটোগুলি সরানো কি সম্ভব?
লিও লোপোল্ড হার্টজ 준영

97

নিম্নলিখিতটি আপনার .brcrc এ রাখুন

shopt -s extglob

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

mv !(fileOne) ~/path/newFolder

অন্যান্য কমান্ডের সাথে ব্যতিক্রম

দ্রষ্টব্য, ডিরেক্টরিগুলি অনুলিপিতে , ফরোয়ার্ড-ফ্ল্যাশ নামটিতে থ্রেডে লক্ষ্য করা যায় না শর্ত ব্যতীত কেন ভাঙা ছাড়া এক্সটগ্লোব? :

cp -r !(Backups.backupdb) /home/masi/Documents/

তাই Backups.backupdb/এখানে ভুল অস্বীকৃতি আগে এবং আমি কারণ ভুলভাবে ব্যবহারের ঝুঁকি ডিরেক্টরি চলন্ত তারপর অন্যান্য কমান্ড এবং সম্ভব অনান্য ব্যতিক্রমের সঙ্গে globs মধ্যে তন্ন তন্ন ব্যবহার করা হবে না।


3
এটি আসলে সঠিক উত্তর। আমার ভুল ফ্ল্যাট ছিল; ভাগ্যক্রমে আমি এটি কেবলমাত্র কয়েকটি ফাইল সহ একটি ফোল্ডারে ব্যবহার করেছি। এখানে ম্যাসি পদ্ধতিটি সম্পর্কে আরও তথ্য দেওয়া হয়েছে: উইকি.বাশ- হ্যাকারস.অর্গ / সাইন্ট্যাক্স / প্যাটার্ন "বর্ধিত প্যাটার্ন ভাষা" এ যান এবং আপনি এই সম্পর্কে আরও তথ্য পাবেন। ইস্যুটি দেখানোর জন্য @ পল-হুইটেকারকে ধন্যবাদ।
মিমোরালিয়া

এটি একটি পুরানো উত্তর তবে এটি এখনও বৈধ। আমি উবুন্টু 18 ব্যবহার করছি এবং এক্সটগ্লোব ডিফল্টরূপে সক্ষম হয়ে গেছে বলে মনে হচ্ছে (আমি এটি কেনাকাটি করিনি)। আমি বর্তমান নির্দেশিকার সমস্ত ফাইল একটি সংরক্ষণাগারে স্থানান্তর করতে নিম্নলিখিত কমান্ডটি ব্যবহার করেছি যা অন্য কোনও সংরক্ষণাগার ফোল্ডার সহ নয়: mv !(arc*) archive_190629b
টনিজি

70

আমি theতিহ্যবাহী অনুসন্ধান এবং xargs উপায় সঙ্গে যেতে হবে:

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | 
    xargs -0 mv -t ~/Linux/New

-maxdepth 1এটি পুনরাবৃত্তি অনুসন্ধান না করে তোলে। আপনি যদি কেবল ফাইলগুলির বিষয়ে যত্নশীল হন তবে আপনি বলতে পারেন -type f-mindepth 1এটি ~/Linux/Oldফলাফলকে নিজের মধ্যে অন্তর্ভুক্ত করে না । এম্বেড করা নতুনলাইনগুলি সহ যে কোনও ফাইলের সাথে কাজ করে।

একটি মন্তব্যে উল্লেখ করা হয়েছে যে এমভি -tবিকল্পটি সম্ভবত জিএনইউ এক্সটেনশন। যে সিস্টেমে এটি নেই For

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
    -exec mv '{}' ~/Linux/New \;

1
এটি একটি শক্তিশালী সরঞ্জাম শেখার জন্য উত্সাহ দেয় যেহেতু উত্সাহিত, সন্ধান করুন। দ্রষ্টব্য, সাদা স্থান সহ ফাইলগুলির জন্য এই কাজটি করবে না। "Find -print0 | xargs -0" বিবেচনা করুন বা অন্যটি পূর্বে xargs: "খুঁজে বের করুন [আপনি যা বলেছিলেন] -exec mv -t {} ~ / Linux / New \;"
জেসনস্মিথ

যদি আপনার এমভি কমান্ডটিতে -t বিকল্প না থাকে, তবে হয় "সন্ধান করুন ... -Exec এমভি {} লিনাক্স / নতুন use" ব্যবহার করুন; বা "সন্ধান করুন ... | xargs -I {v mv {} লিনাক্স / নতুন"। -T বিকল্পটি একটি জিএনইউ এক্সটেনশন বলে মনে হচ্ছে, যা লিনাক্সের জন্য ভাল, তবে অন্য কোথাও নেই।
রব কেনেডি

jhs, ওহ আমি ব্যর্থ। আমি একরকম ভেবেছিলাম xargs নতুন লাইনে বিভক্ত হয়েছে তবে ফাঁকা জায়গায় নয়। দেখে মনে হচ্ছে যে আমি এটি "পড়ুন" দিয়ে বিভ্রান্ত করেছি :) এটির অসুবিধা ঠিক করুন
জোহানেস স্কাউব - লিটব

দুর্দান্ত টিপের জন্য দুর্দান্ত ধন্যবাদ! আমি sth নির্বাচন করতে যাচ্ছি কারণ এটি প্রশ্ন লক্ষ্য করে। তবে আমি পরে আপনার আদেশগুলির কার্যকারিতা অনুধাবন করতে পারি, সুতরাং আমাকে অবশ্যই "সন্ধান করুন এবং xargs" উপায় বেছে নিতে হবে। এটা শুধু দোলা। ধন্যবাদ :)
লিও লোপোল্ড হার্টজ

জটিল উপায়। মাসি উত্তর আরও সম্পূর্ণ, সহজ এবং আরও সঠিক জন্য
ব্যবহারকারীর 637338

30

একটি দ্রুত উপায় হ'ল টাক্স ফাইল নামটি সংশোধন করা যাতে আপনার মুভ কমান্ডটি মেলে না।

উদাহরণ স্বরূপ:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

" " ব্যবহার করবেন না , কারণ এটি "" থাকা ফাইলগুলিকে কেবল স্থানান্তরিত করবে। নামে. শুধু "*" যথেষ্ট।
জুলিয়ানো

1
আপনি যদি এটি * তে পরিবর্তন করেন তবে এটি আপনার নাম পরিবর্তন করা ফাইলটিও সরিয়ে ফেলবে।
জন টি

6
@ জন টি: না, ডট দিয়ে শুরু হওয়া ফাইলগুলি * গ্লোব মেলে না।
বিল কারভিন

এটি এখন পর্যন্ত সেরা উত্তর। এই উত্তরটি পরিবর্তন বা মন্তব্য করার প্রয়োজন নেই। 100 পয়েন্ট। অনেক ধন্যবাদ. সাবাশ!
স্টিভ কে

22

আমি মনে করি সবচেয়ে সহজ উপায় ব্যাকটিক্স দিয়ে with

mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

সম্পাদনা:

এলএস দিয়ে ব্যাকস্ল্যাশ ব্যবহার না করে এর পরিবর্তে ওরফে ব্যবহার করা রোধ করুন, বেশিরভাগ ক্ষেত্রে ls কে এলএস - রঙ হিসাবে আলাদা করা হয়েছে।

mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

ধন্যবাদ @ আর্নল্ড রো


1
আপনি grep -vসেখানে কেন ব্যবহার করবেন দয়া করে ব্যাখ্যা করতে পারেন ?
লিও লোপোল্ড হার্টজ 준영

গ্রেপ -v বিকল্পটি ফলাফলকে বাদ দেয় না, এটি টাক্স.পিএনজি ছাড়া সমস্ত কিছু গ্রহণের মতো
আব্বাস

1
এটি অবশ্যই স্বজ্ঞাত, তবে উপরের উত্তরগুলি আরও ভাল। আপনি যদি কোনও স্ক্রিপ্ট লিখছেন, উদাহরণস্বরূপ,
এটির

@ এনজেজিএল আমরা এখানেও নিখুঁত পথ দিতে পারি, আমি হোম ডাইরেক্টরি (~) ব্যবহার করেছি যেহেতু প্রশ্নটি ছিল
রোহেল আব্বাস

@ রোহাইলআব্বাস ফেয়ার যথেষ্ট। ✌️
এনজেজিএল


13

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

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET


1
এটি আমার পক্ষে এমন পরিস্থিতিতে কাজ করেছিল যেখানে আমাকে কয়েকটি ফোল্ডার ছাড়া সমস্ত ফাইল অন্য ডিরেক্টরিতে নিয়ে যেতে হয়েছিল
উমর হায়াত

-lবিকল্প lsকমান্ড লাইন অপ্রাসঙ্গিক তথ্য অনেক অন্তর্ভুক্ত করা এবং mv কমান্ড ব্যর্থতার স্থাপিত হবে।
jdhao

5

নিম্নলিখিতটি 100% গ্যারান্টিযুক্ত পদ্ধতি নয় এবং স্ক্রিপ্টিংয়ের জন্য মোটেও চেষ্টা করা উচিত নয়। তবে কিছু সময় দ্রুত ইন্টারেক্টিভ শেল ব্যবহারের জন্য এটি যথেষ্ট ভাল। মত একটি ফাইল ফাইল গ্লোব

[abc]*

(যা a, b বা c দিয়ে শুরু হওয়া নামের সাথে সমস্ত ফাইলের সাথে মিলবে) প্রথমে "^" অক্ষর সন্নিবেশ করে তুচ্ছ করা যেতে পারে

[^abc]*

আমি মাঝে মাঝে এটি "হারিয়ে যাওয়া + পাওয়া" ডিরেক্টরিটি মিল না করার জন্য ব্যবহার করি, উদাহরণস্বরূপ:

mv /mnt/usbdisk/[^l]* /home/user/stuff/.

অবশ্যই যদি অন্য ফাইলগুলি এল দিয়ে শুরু হয় তবে আমি তাদের পরে প্রক্রিয়া করব।


4
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

ফাইন্ড কমান্ড সমস্ত নিয়মিত ফাইল তালিকাভুক্ত করে এবং fgrep কমান্ডটি যে কোনও Tux.png ফিল্টার করে। ব্যাকটিকগুলি এমভিকে ফলাফলের ফাইল তালিকাটি সরাতে বলে।


4
অন্য কমান্ডের জন্য আর্গুমেন্ট হিসাবে কখনও কখনও মূল্যায়ন করবেন না। খারাপ জিনিস হবে। আপনি সবেমাত্র দুর্বলতা তৈরি করেছেন। সর্বদা সন্ধান করুন -প্রিন্ট 0 | xargs -0 নির্মাণ, বা সন্ধান করুন।
জুলিয়ানো

3

আপনি কীভাবে ফোল্ডারে সমস্ত কিছু সরিয়ে নিয়ে যান এবং তারপরে Tux.png কীভাবে ফিরে যান?

"অফ্যান্ডহ্যান্ড ..." বাদ দিয়ে কোনও শেল সিনট্যাক্সের কথা ভাবতে পারি না।


3
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'

1
এই কমান্ডটির একটি অংশ অনুপস্থিত মনে হচ্ছে এবং এটি আমার কম্পিউটারে কাজ করে না। ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/পরিবর্তে কাজ করে।
ক্যাথরিন চেন

3

কেমন:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

আপনি যদিও ফোল্ডারে থাকতে হবে।



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