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


243

আমার কাছে একটি ডিরেক্টরি রয়েছে যাতে প্রচুর পরিমাণে ফাইল থাকে। আমি file.txt ব্যতীত সমস্ত ফাইল মুছতে চাই। আমি এটা কিভাবে করবো?

অযাচিতগুলিকে স্বতন্ত্রভাবে মুছে ফেলার জন্য অনেকগুলি ফাইল রয়েছে এবং এই ফাইলগুলি বাদ দিয়ে তাদের নামগুলি * ব্যবহার করার জন্য খুব বিচিত্র।

কেউ ব্যবহার করার পরামর্শ দিয়েছেন

rm !(file.txt)

কিন্তু এটি কাজ করে না। এটি ফিরে আসে:

Badly placed ()'s 

আমার ওএসটি বৈজ্ঞানিক লিনাক্স 6।

কোন ধারনা?


13
আপনি যেটিকে রাখতে চান তা সরান, তারপরে অন্যদের আরএম করবেন?
অলিভিয়ার ডুলাক

5
@ অলিভিয়ারডুলাক আমরা কি এই প্রশ্নে কেবলমাত্র দু'জন ব্যক্তি যারা প্রশ্নটি ওভারটিকিং করছি না?
শাদুর

1
@ শাদুর: ভাল, আমি তাদের সাথে সম্পর্কিত করতে পারি: oneliners আকর্ষণীয় ... ^^
অলিভিয়ার দুলাক

1
ধন্যবাদ, এবং হ্যাঁ আমি একটি লাইন সমাধান খুঁজছিলাম। আমার প্রায়শই এটি করতে হয় বলে ফাইলগুলি ঘুরে বেড়াতে খুব বেশি সময় লাগে।
কান্টুরা

উত্তর:


287

POSIXly:

find . ! -name 'file.txt' -type f -exec rm -f {} +

ব্যতীত সমস্ত নিয়মিত ফাইল মুছে ফেলা হবে (পুনরাবৃত্তভাবে, লুকানো ফাইলগুলি সহ) file.txt। ডিরেক্টরিগুলি সরাতে, এতে পরিবর্তন -type fকরুন -type dএবং এতে -rবিকল্প যুক্ত করুন rm

ইন bash, ব্যবহার করতে rm -- !(file.txt), আপনাকে অবশ্যই এক্সট্লোব সক্ষম করতে হবে :

$ shopt -s extglob 
$ rm -- !(file.txt)

(বা কল করা bash -O extglob)

মনে রাখবেন যে extglobকেবল bashএবং কর্ন শেল পরিবারে কাজ করে। এবং ব্যবহারের rm -- !(file.txt)ফলে Argument list too longত্রুটি হতে পারে ।

ইন zsh, আপনি এক্সটেন্ডডগ্লোব সক্ষম ^সহ প্যাটার্নটিকে উপেক্ষা করতে পারেন :

$ setopt extendedglob
$ rm -- ^file.txt

অথবা সঙ্গে একই সিনট্যাক্স ব্যবহার kshএবং bashবিকল্প সহ ksh_globএবং no_bare_glob_qualসক্ষম করা হয়েছে।


9
ডিরেক্টরি উল্লেখ করা ভাল অনুশীলন (এই ক্ষেত্রে ফুলপথ? বা সম্ভবত এখানে একটি সতর্কতা যুক্ত করুন যে এই কমান্ডটি বর্তমান ওয়ার্কিং ডিরেক্টরি থেকে শুরু করে প্রতিটি ফাইল মুছে ফেলবে ?) আমি সাধারণত যে কোনো উদাহরণ লিখতে rmযেমন echo rmপরিবর্তে, এবং মানুষ জিজ্ঞাসা শুধুমাত্র প্রতিধ্বনি খুঁজে নিতে যখন তারা সত্যিই এটা কি করতে চান তারা কি করতে হবে নিশ্চিত। তা ছাড়া, পুরো উত্তরের জন্য +1
অলিভিয়ার ডুলাক

11
আমি এর -deleteপরিবর্তে -execআরও খাটো এবং মনে রাখার চেয়ে সহজ পরামর্শ দেব
ইজকাটা

6
@ ইজকাটা: পসিক্স -deleteদ্বারা সংজ্ঞায়িত করা হয়নি।
cuonglm

5
কীভাবে ফাইলের তালিকা বাদ দেবেন?
মাইসাম

5
@ মাইসাম - এমন একটি সমাধানের জন্য আমার উত্তরটি দেখুন যা ফাইলগুলির একটি তালিকা পরিচালনা করবে। জিনুকের findসমাধান ছাড়া অন্য কিছু আপনি করতে পারেন ! \( -name one_file -o -name two_file \)এবং আরও।
মাইকজার্ভ

112

অন্য একটি ভিন্ন দিক নিয়ে যান (যদি ফাইলের নামে কোনও স্থান নেই)

ls | grep -v file.txt | xargs rm

বা (ফাইলের নাম ফাঁকা থাকলেও কাজ করে)

ls | grep -v file.txt | parallel rm

থেকে man grep:

 -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v is specified by POSIX)

2
ফাইলের নামের স্থান থাকলে এটি কাজ করবে না ...
মাত্তিও

1
Ciao @Matteo, এটা খুব স্পেস ফাইল জন্য কাজ করে, কিন্তু আপনি, কোট দ্বারা, grep-প্যাটার্ন ঘিরা যেমন প্রয়োজন ls | grep -v "a file with spaces.bin" | xargs rm। এটি সাধারণ grepবাক্য গঠন।
সেবাস্তিয়ান

1
@ সেবাস্তিয়ান সমস্যাটি grepকিন্তু নয় rmrmস্থান দ্বারা পৃথক আর্গুমেন্টের একটি তালিকা পাবেন। চেষ্টা করুন touch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm: আপনি পাবেন rm: c: No such file or directoryএবংrm: d: No such file or directory
মাত্তিও

1
হ্যাঁ, এটি একটি সাধারণ সমস্যা। -print0ভিতরে findএবং -0ভিতরে বিকল্পগুলি দেখুন xargs। এখানে একটি workaround, কিন্তু কিছুটা অসুবিধে হয়। find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm। যাইহোক, gnu parallelএটি ভালভাবে পরিচালনা করে (আমি প্রায়শই এটিকে xargs এর বিকল্প হিসাবে ব্যবহার করি:ls | grep -v 'a b' | parallel rm
সেবাস্তিয়ান

1
এটি কেবল ফাঁকা স্থান নয়, এটি সমস্ত শূন্যস্থান এবং নিউলাইনগুলি, তবে অক্ষরগুলি (একক, ডাবল কোটস এবং ব্যাকস্ল্যাশ) এবং ফাইল নামগুলি দিয়ে শুরু করে -
স্টাফেন চেজেলাস

32

একটি অনুলিপি বজায় রাখুন, সবকিছু মুছুন, অনুলিপি পুনরুদ্ধার করুন:

{   rm -rf *
    tar -x
} <<TAR
$(tar -c $one_file)
TAR

এক লাইনে:

{ rm -rf *; tar -x; } <<< $(tar -c $one_file)

তবে এর জন্য একটি শেল দরকার যা এখানে স্ট্রিং সমর্থন করে।


10
এটা কিছুটা মন খারাপ করে।
বনাম

2
@ ডেরেক - দয়া করে সম্পাদনাটি দেখুন।
মাইকজার্ভ

2
তবে এটি যদি অর্ধেকের মধ্যে বাধাগ্রস্ত হয়, বা অন্য কিছু ভুল হয়ে যায় তবে ফাইলটি চলে গেছে।
কাস্পার্ড

2
@ ক্যাস্পার্ড - না প্যারেন্ট শেলটি চলার সময় rmএবং এর মধ্যেই মারা যায় tar -xrmএটি যতটা ব্যর্থ করতে পারে
মাইকজার্ভ

2
এটি অন্য ডিরেক্টরিতে স্থানান্তরিত এবং এটি আবার সরিয়ে নিয়ে যাওয়ার জন্য আরও দক্ষ নয়? আমাদের কেবল ফাইলের বিষয়বস্তু নিয়ে কাজ করার দরকার নেই।
লিওনব্লয়

23

আপনি সব এই overth سوچ করছি।

cd ..
mv fulldir/file.txt /tmp/
rm -rf fulldir
mkdir fulldir
mv /tmp/file.txt fulldir/

সম্পন্ন.

সম্পাদনা প্রকৃতপক্ষে, সহজ:

cd ..
ln fulldir/file.txt ./
rm -rf fulldir
mkdir -p fulldir
mv file.txt fulldir/

3
আমার উত্তর যে একই জিনিস। exce [pt এটি ডিয়ারের কোনও অনুমতি হারাবে না।
মাইকজার্ভ

6
যদি এটি / tmp থেকে আলাদা ফাইল সিস্টেমে একটি বৃহত ফাইল হয় এবং আপনি ফাইল সিস্টেমের মূল থেকে সবকিছু সরিয়ে দেওয়ার চেষ্টা করছেন, তবে এটিকে নিরাপদে কোথাও সরিয়ে নেওয়া কোনও বিকল্প নয়।
জনি

1
এটি অবশ্যই সহজ উত্তর।
বেন লিয়ানাজ

17

আমার বৈজ্ঞানিক লিনাক্স 6 ওএসে এটি কাজ করে:

shopt -s extglob
rm !(file.txt)

আমি ভার্চুয়াল মেশিনে দেবিয়ান 32 বিট ইনস্টলও করেছি। উপরেরগুলি কাজ করে না তবে নিম্নলিখিতগুলি কাজ করে:

find . -type f ! -name 'file.txt' -delete

1
আপনি যে findসমাধানটি দিয়েছিলেন তা কি কাজ করে না?
cuonglm

"কাজ করে না" বা "কাজ করছে না"। হ্যাঁ আপনার সন্ধানের সমাধানটিও কাজ করে। ধন্যবাদ।
কান্টুরা

1
আপনি এটি আরও বিশদ করতে পারেন? কীভাবে "কাজ হয়নি? এটি অন্যান্য ফাইলগুলি মুছে না, বা এটি মুছে ফেলেছে file.txtবা অন্য কিছু?
cuonglm

আমি বোঝাতে চাইছিলাম যে ডেবিয়ান ওএসে "$ rm! (File.txt)" ফিরিয়ে দেয় "খারাপভাবে স্থাপন () এর"। সুতরাং আমি "$ শপট-এক্স এক্সগ্লোব" চেষ্টা করেছি, কিন্তু এটি ফিরে এসেছে: "শপ্ট: কমান্ড পাওয়া যায় নি"। তারপরে আমি "সন্ধান" সমাধানটি চেষ্টা করেছিলাম। এটা কাজ করে।
কান্টুরা

1
ওহ, অবশ্যই এটি কাজ করে না। shoptএকটি tcshঅন্তর্নির্মিত না ।
cuonglm

10

rm !("file.txt")পরিবর্তে ব্যবহার করুনrm !(file.txt)


4
এটি যে কোনও ক্ষেত্রেই কোনও পার্থক্য করে না। এখানে সমস্যাটি ছিল যে ওপি 1 ছিল) এই ফর্ম্যাটটিকে সমর্থন করে এমন শেল ব্যবহার করছে না এবং 2) এমনকি ব্যাশেও আপনাকে এটিকে সক্ষম করতে হবে shopt -s extglob। যাই হোক না কেন, এর মতো সরল ফাইলনামের উদ্ধৃতি দিয়ে কোনও পার্থক্য হত না।
টেরডন

1
শুধু ব্যবহারের ফোল্ডারটি করতে - rm -rf! ("
ইউट्स

7

কেবল একটি ভিন্ন উত্তর দেওয়ার জন্য, আপনি rmএটির ডিফল্ট আচরণ ব্যবহার করতে পারেন যা এটি ফোল্ডারগুলি মুছবে না:

mkdir tmp && mv file.txt tmp  # create tmp dir and move files there
rm                            # delete all other files
mv tmp/* . && rm -rf tmp      # move all files back and delete tmp dir

1

আমি দেখতে পেলাম যে এই পদ্ধতিটি খুব সহজ, কাজ করে এবং এর জন্য কোনও বিশেষ এক্সটেনশন প্রয়োজন হয় না (যা আমি জানি!)

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