Temporary দিয়ে শেষ হওয়া অস্থায়ী ফাইলগুলি মোছার জন্য আদেশ ~


15

অনেক দিন আগে, আমি এই দরকারী বাশ ওরফে খুঁজে পেয়েছি (আমার। / .Bash_aliases এর সামগ্রী )

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

এখন আমি 3 টি ফাইল সমাপ্ত এমন কোনও ডিরেক্টরি rm~পরে ব্যবহার করার চেষ্টা করেছিcd~

টার্মিনালে আমি এই ত্রুটি পেয়েছি, এবং ফাইলগুলি মোছা হয়নি

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

এছাড়াও যখন আমি চেষ্টা rm~থেকে /home/me, এটা অসম্মতির বলে মনে হয়। অথবা এটি হয়ত অনেক সময় নিচ্ছে।

আমাকে কেন ত্রুটি হচ্ছে এবং কীভাবে এটি ঠিক করব তা বলুন।

ধন্যবাদ!

উত্তর:


26

আপনার বাশ ওরফে ভাল লেখা নেই (একক উদ্ধৃতি ভাল ব্যবহার করা হয় না)। পরিবর্তে এটি হওয়া উচিত:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

এখন, আমি ব্যক্তিগতভাবে পাইপগুলির অকেজো ব্যবহার পছন্দ করি না এবং xargsতাই আপনার এলিফটি আরও ভালভাবে লেখা হবে:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

-type fশুধুমাত্র ফাইল (না ডিরেক্টরি, লিঙ্ক, ইত্যাদি), এটি তাই হিসাবে বিকল্প -vবিকল্প rmতাই হিসাবে বাগাড়ম্বরপূর্ণ (আউট কি এটা মুছে ফেলা কপি করে প্রিন্ট) যাবে। +শেষে যাতে findরান rm(spawns মাত্র এক উদাহরণ হিসেবে বলা যায় সব পাওয়া ফাইলগুলির সাথে rmফাইল প্রতি এক, পরিবর্তে)।

এখন থেকে man bash:

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

একটি উপনামের পরিবর্তে, একটি ফাংশন ব্যবহার করা ভাল: .bash_aliasesফাইলটিতে আপনার উপনামটি মন্তব্য করুন (যেমন, #সেই লাইনের সামনে একটি রাখুন ), এবং ফাইলটিতে .bashrcএই ফাংশনটি রাখুন (ফাইলের যে কোনও জায়গায়, শেষে ভাল আছে) :

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

এছাড়াও, অন্যান্য উত্তর হিসাবে উল্লেখ করা হয়েছে, আপনি সন্ধানের জন্য -deleteআদেশটি ব্যবহার করতে পারেন । এই ক্ষেত্রে, আপনার rm~ফাংশনটি হবে:

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

আসলে, আপনি একটি দুর্দান্ত ফাংশন করতে পারেন যা একটি যুক্তি নেবে, বলুন --dry-run, এটি কেবল এটিই মুছে ফেলবে যা ফলাফল দেয়:

rm~() {
    case "$1" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

তারপরে ব্যবহার করুন:

rm~ --dry-run

মুছে ফেলা হবে এমন ফাইলগুলি প্রদর্শন করতে (তবে সেগুলি মুছবে না) এবং তারপরে

rm~

আপনি যখন এতে খুশি হন

অভিযোজন এবং আপনার প্রয়োজন প্রসারিত!

বিঃদ্রঃ. পরিবর্তনগুলি কার্যকর করার জন্য আপনাকে একটি নতুন টার্মিনাল খুলতে হবে।


ধন্যবাদ! এটি দুর্দান্তভাবে কাজ করে এবং শুকনো রান চূড়ান্ত সহায়ক।
বিনায়ক গর্গ

2
find -type f -name '*~' -delete(পছন্দের অস্ত্র ছাড়াও git clean -dfx .)
sehe

2
এটি যেমন একটি মার্জিত সমাধান, আমি আপনাকে প্রপস দিতে কেবল লগইন করতে হয়েছিল। +1 আপনাকে, আমার ভাল বন্ধু!
কোডচিম্প

9

*~এটি আপনার ওরফে নির্ধারিত হওয়ার আগে শেল দ্বারা প্রসারিত হয়। আসল অ্যাসাইনমেন্টটি হ'ল:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

আমি এলিয়াসগুলির পরিবর্তে ফাংশনগুলি ব্যবহার করার পরামর্শ দিচ্ছি, এগুলি উদ্ধৃতিগুলির সাথে পরিচালনা করতে অনেক বেশি শক্তিশালী এবং সহজ।

আমরা এটিতে থাকাকালীন, অতিমাত্রায় অপসারণ .(কোনও প্যারামিটার না দেওয়া থাকলে বর্তমান ডিরেক্টরি নির্দেশিত) এবং অপশন ইতিমধ্যে বিদ্যমান থাকার xargsকারণে গালি দেওয়া বন্ধ করুন -delete

rm~() { find -name '*~' -ls -delete; }

-lsবিকল্প ঐচ্ছিক, কিন্তু এটা যোগ করার আপনাকে দেখাবে যা ফাইল মুছে দেওয়া হয়েছে।


+1 ধন্যবাদ! তবে আমি এই ফাংশনটি কোথায় যুক্ত করব?
বিনায়ক গর্গ

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