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


11

আদর্শভাবে আমি এই জাতীয় কমান্ড চাই

rm --only-if-symlink link-to-file

কারণ আমি নিজেকে অনেক বার জ্বলিয়ে দিয়েছি দুর্ঘটনাক্রমে ফাইলটি সিমেন্টলাইকের পরিবর্তে ফাইলটি মুছতে। এটি বিশেষত খারাপ হতে পারে যখন সুডো জড়িত থাকে। এখন অবশ্যই ls -alএটি নিশ্চিত করার জন্য আমি একটি করণীয় যে এটি সত্যিই একটি সিমিলিংক এবং এরকম তবে এটি অপারেটরের ত্রুটির (একইভাবে নামযুক্ত ফাইল, টাইপো, ইত্যাদি) এবং জাতি অবস্থার (যদি কেউ আমাকে কোনও কারণে কোনও ফাইল মুছতে চায়) এর ঝুঁকিপূর্ণ হয়। কোনও ফাইল একটি সিমলিংক কিনা তা যাচাই করার কোনও উপায় আছে এবং এটি যদি কেবল একটি কমান্ডে থাকে তবে তা মুছুন?


1
আমি মনে করি না যে দৌড়ের অবস্থাটি উদ্বেগজনক হওয়া উচিত। যে কেউ সিমলিংকটি মুছে ফেলতে এবং ফাইলের সাথে এটি প্রতিস্থাপন করতে সক্ষম হবেন তাদের ডিরেক্টরিতে লেখার অনুমতি প্রয়োজন হবে যার অর্থ তারা নিজেও ফাইলটি মুছতে পারেন।
নেট এল্ড্রেজ

উত্তর:


19
 $ rm_if_link(){ [ ! -L "$1" ] || rm -v "$1"; }

 #test
 $ touch nonlink; ln -s link
 $ rm_if_link nonlink
 $ rm_if_link link
   removed 'link'     

4
অবশ্যই এটি সরানো !এবং এতে পরিবর্তন আরও স্পষ্ট ||হবে&&
glenn jackman

5
@glennjackman আমি ||ফর্মটি পছন্দ করার অভ্যাস করেছি । &&আপনি set -eমোডে থাকলে জিনিসগুলি নামিয়ে আনে ।
পিএসকোকিক

@ স্পস্কিক এটি সাধারণভাবে ঝুঁকিপূর্ণ যেহেতু এটি আকর্ষণীয় ক্ষেত্রে (ফাইলটি বিদ্যমান এবং একটি সিমিলিংক) এবং শূন্য-বহির্গমন কোডের জন্য অন্যান্য কারণগুলির মধ্যে যেমন একটি খালি অব্যর্থিত মান ( [ ! -L $1 ]) অবৈধ অপারেটর ( [ ! -l foo ]), অথবা সিনট্যাক্স ত্রুটি ( [ ! -q foo || echo foo)
l0b0

2
@ জিওনজিচিয়ামিওভ সমস্যাটি rm_if_link(){ [ -L "$1" ] && rm -v "$1"; }হ'ল ননলিঙ্কে set -e মোডে এটি চালানো আপনার শেল প্রক্রিয়াটিকে হারাবে । আপনি সংযোজন করতে পারেন || :তবে এটি আইএমএইচও হয়ে যায়, ! ||সংস্করণটির চেয়েও কম পরিষ্কার এবং এটি আপনাকে rmমেরে ফেলতে ব্যর্থতা রোধ করবে set -e, যা সম্ভবত অনাকাঙ্ক্ষিত। ! ||এটি বেশ সংক্ষিপ্ত এবং পরিষ্কার, এবং এই সমস্যার কোনওটিতেই ভুগছে না।
পিএসকোকিক

1
নাহ । অন্যান্য বিকল্পগুলি: ক) rmআপনার পরীক্ষার ভিতরে রাখুন, খ) সত্যিকারের বিবৃতি ব্যবহার করুন, গ) -eইন্টারেক্টিভ শেলগুলি ব্যবহার করে ঘুরবেন না (এবং আপনার স্ক্রিপ্টগুলি পরীক্ষা করুন!)। আপনি যদি পঠনযোগ্যতার বিষয়ে তর্ক করতে চান ifতবে কিছু লিঙ্ক কিনা তা পরীক্ষা করে ব্যবহার করা বেশ পরিষ্কারভাবে বিজয়ী।
মনিকার সেলিও

5

আপনি ব্যবহার করতে পারেন findএবং এর -type lপরীক্ষার শর্ত (যা পরীক্ষা করে দেখতে পাওয়া যায় যে বস্তুটি এল কালি কিনা তা পরীক্ষা করে )

উদাহরণস্বরূপ, আপনার যদি fooবর্তমান ডিরেক্টরিতে কোনও ফাইল কল করা থাকে তবে আপনি এটি করতে পারেন:

$ find . -type l -iname "foo" -delete

আপনি কেবল এটি দিয়ে সহজ করতে সক্ষম হবেন:

$ find . -maxdepth 1 -type l -delete

যা বর্তমান ডিরেক্টরিতে থাকা সমস্ত সিমলিংক মুছে ফেলবে।

সতর্কতা:

-deleteবিকল্প findসত্যিই সত্যিই বিপজ্জনক। ফাইন্ড কম্যান্ডের শেষে এটি স্থির করতে নিশ্চিত হন। যদি আপনি এটি ভুল জায়গায় স্থাপন করেন তবে ফলাফলগুলি আপনার শর্তাবলীর সাথে মেলে কিনা তা নির্বিশেষে এটি যা কিছু আবিষ্কার করে তা মুছে ফেলবে।

মন্তব্যে প্রস্তাবিত হিসাবে, একটি নিরাপদ বিকল্প ব্যবহার findএবং rm -i(যা আপনাকে ফাইল অপসারণের নিশ্চয়তা দিতে বাধ্য করে) হতে পারে :

$ $ find . -type l -iname "foo" | xargs rm -i

ব্যক্তিগতভাবে আমি -exec trash {} \;ফাইলগুলি সাময়িকভাবে মুছে ফেলার জন্য ব্যবহার করি কারণ আমিও নিজের মতো rmকরে অতীতে পুড়েছি। ডাবল একটি ভুল জায়গায় ফেলে দেওয়া -deleteপতাকার জন্য যায় ।

http://slackermedia.ml/trashy


1
মুছে ফেলার পরিবর্তে আপনি কেবল এটি মুদ্রণ করতে এবং এটিকে জার্গ্সে দিতে পারেন: find . -type l -iname "foo" | xargs rm -i এটি নিরাপদ।
বোবান পি।

1
rm -iসুরক্ষার জন্য আমি অবশ্যই @বোয়ানপি.-এর ব্যবহার পছন্দ করি।
ক্লাতাতু ভন শ্ল্যাকার

3
"এটি বর্তমান ডিরেক্টরিতে থাকা সমস্ত প্রতীককে মুছে ফেলবে" ... এবং এর নীচের যে কোনও বিন্দুতে।
জোসেফ আর

1
হিসাবে @ জোসেফআর। বলেছিল, এটি রাস্তায় নেমে যেতে হবে। সন্ধানে -ম্যাক্সডেপথ 1 যোগ করুন।
বোবান পি।

1
স্পেস সহ ফাইলের নামগুলিতে এখনও বিরতি। এর -print0জন্য findএবং এর -0জন্য ব্যবহারের পরামর্শ দিন xargs
ওয়াইল্ডকার্ড

4
zsh -c 'rm foo(@)'

@একটি গ্লোব যোগ্যতা ; প্যাটার্নটি foo(@)মেলে যা fooমেলে তবে কেবল প্রতীকী লিঙ্কগুলি।

foo(-@)কেবল ভাঙা প্রতীকী লিঙ্কগুলির সাথে মেলে। foo(@,L0)শুধুমাত্র প্রতীকী লিঙ্ক এবং খালি ফাইলের সাথে মিলবে।

অবশ্যই, আপনি যদি প্রথম স্থানে zsh চালাচ্ছেন তবে আপনার কেবল টাইপ করা দরকার rm foo(@)Enterটাইপ করার আগে চাপ না দেওয়ার জন্য আপনাকে খেয়াল রাখা দরকার (@)


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