শেল স্ক্রিপ্ট যদি কোনও ফাইল ইতিমধ্যে বিদ্যমান থাকে তবে সেটিকে সরাতে


183

আমি এমন কিছু স্টাফের উপর কাজ করছি যেখানে আমি একটি ফাইলে ডেটা সংরক্ষণ করি। তবে প্রতিবার আমি স্ক্রিপ্টটি চালনা করে এটি পূর্ববর্তী ফাইলটিতে যুক্ত হয়।

আমি যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে তবে আমি কীভাবে সরিয়ে ফেলতে পারি তাতে সহায়তা চাই।


3
ফাইলটি উপস্থিত আছে কিনা তা পরীক্ষা করুন ... এবং তারপরে কল করুন rm $my_file, তাই না? আপনি কোন শেল ব্যবহার করছেন?
ক্রিস স্প্রেগ

উত্তর:


182

ফাইলটি উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখার ঝামেলা করবেন না, কেবল এটি সরাতে চেষ্টা করুন।

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null

নোট করুন যে ফাইলটি উপস্থিত না থাকলে দ্বিতীয় কমান্ড ব্যর্থ হবে (একটি শূন্য-বহির্গমন স্থিতি ফিরিয়ে দেবে) তবে প্রথমটি -f(সংক্ষিপ্ত --force) বিকল্পের কারণে সফল হবে । পরিস্থিতির উপর নির্ভর করে এটি একটি গুরুত্বপূর্ণ বিবরণ হতে পারে।

তবে সম্ভবত, আপনি যদি ফাইলটিতে সংযোজন করছেন তবে এটি হ'ল কারণ আপনার স্ক্রিপ্ট >>ফাইলটিতে কোনও কিছুকে পুনর্নির্দেশ করতে ব্যবহার করছে। শুধু প্রতিস্থাপন >>সঙ্গে >। আপনি কোনও কোড সরবরাহ না করায় এটি বলা শক্ত।

নোট আপনি যে পারেন ভালো কিছু করতে test -f /p/a/t/h && rm /p/a/t/h, কিন্তু এমনটি সম্পূর্ণরূপে অর্থহীন নয়। পরীক্ষাটি সত্য হয়ে উঠবে এটা যথেষ্ট সম্ভব তবে আপনি এটি অপসারণ করার চেষ্টা করার আগে / p / a / t / h এর অস্তিত্ব পাওয়া যাবে না, বা আরও খারাপ পরীক্ষাটি ব্যর্থ হবে এবং / পি / এ / টি / ঘন্টা তৈরি হবে আপনি পরবর্তী কমান্ডটি কার্যকর করার আগে যা এটির উপস্থিতি প্রত্যাশা করে। এটি চেষ্টা করা একটি ধ্রুপদী রেসের শর্ত। এটা করবেন না।


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

@uchuugaka এই সহজ সমাধান যখন আপনি যদি একটি ফাইল আছে পরোয়া করি না, সব যদি আপনি চান এটা নিশ্চিত করা হয় না আছে।
লুকাস লিসিস

পার্শ্ব প্রতিক্রিয়াগুলি সম্পর্কে ভাল উত্তরগুলি আগত হওয়া উচিত এবং সম্পূর্ণ হওয়া উচিত আমার বার্তার সাধারণকরণ, তবে শেল স্ক্রিপ্টগুলি প্রায়শই জানতে চায় যে কোনটি পাওয়া যায় না এবং কোনটি কার্যকর হয় না বা হয় না।
uchuugaka

rm /p/a/t/h 2> /dev/nullecho $?ফাইল বিদ্যমান না থাকলে রিটার্ন কোড ( ) 0 হিসাবে রাখবে না । এটি জেনকিন্সকে বিভিন্ন ধরণের কাজগুলি ব্যর্থ করে দেবে কেবলমাত্র আমরা একটি বিদ্যমান ফাইল মুছে ফেলার চেষ্টা করেছি।
ViFI

@ মুচুগাকা - আমি বেশ কিছু সময়ের জন্য এই মন্তব্যটির প্রতিক্রিয়া জানাতে এড়িয়েছি, তবে এটির দিকে নজর দেওয়া দরকার। ফাইল মোছার আগে ফাইলটি উপস্থিত রয়েছে কিনা তা পরীক্ষা করা সবসময় খারাপ ধারণা is আমার উত্তরের চূড়ান্ত অনুচ্ছেদ দেখুন। একটি সহজাত রেসের শর্ত রয়েছে যা কেবল সেই ধরণের জিনিস করে এড়ানো যায় না। আপনি যদি কোনও বিদ্যমান ফাইলটি ওভাররাইট করতে না চান, আপনি কিছু শেল নির্দিষ্ট যাদু চেষ্টা করতে পারেন (যেমন noclobberব্যাশের মতো ), বা সম্ভবত উপস্থিত ফাইলটি chmod-ing করতে পারেন তাই যদি ফাইলটি উপস্থিত থাকে তবে পুনর্নির্দেশ ব্যর্থ হয় (রেসের শর্তটি এড়ায় না), তবে যা যা করবে তা হ'ল বাগগুলি আরও সূক্ষ্ম করে তোলা।
উইলিয়াম পার্সেল

126

আমি আর একটি লাইন কমান্ড ব্যবহার করেছি:

[ -e file ] && rm file

11
অথবা বিকল্পভাবে: [! -e ফাইল] || আরএম ফাইল এই সংস্করণটি কিছু ত্রুটির পরিবর্তে 0 প্রদান করে।
নওফেল বিগ

@ নওফেলবাগ ধন্যবাদ, দীর্ঘ স্ক্রিপ্টে শিকল দেওয়ার জন্য এটি দুর্দান্ত।
আবে

83

আপনি এটি ব্যবহার করতে পারেন:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi

4
এটি নির্বাচিত উত্তর হওয়া উচিত।
ইনজারনেট

সহজ এবং পড়তে সহজ এবং echo $?ফাইলের অস্তিত্ব না থাকলে 1 টি দেয় না তাও নিশ্চিত করে।
viFI

প্রয়োজনে আপনি ওয়ান-লাইনার হিসাবে এটিও করতে পারেন, নীচে আমার উত্তরটি দেখুন।
nbeuchat

65

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

 rm -f xyz.csv

1
এই মাত্র সর্বোচ্চ রেট উত্তর অংশ অনুরূপ, 2015. থেকে
forgivenson

15
মূল উত্তরটি ব্যাখ্যা করে না যে -fএটির সাথে এটি কোনও ত্রুটি ছুঁড়ে না। এই উত্তরটি আমাকে সাহায্য করেছে, আপনাকে ধন্যবাদ।
ডগ

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

16

যদি একটি ফাইল ইতিমধ্যে বিদ্যমান থাকে তবে এটি সরানোর জন্য একটি লাইনার শেল স্ক্রিপ্ট (জিন্দ্র হেল্কেলের উত্তরের ভিত্তিতে):

[ -f file ] && rm file

অথবা একটি পরিবর্তনশীল সহ:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file

13

এরকম কিছু কাজ করবে

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-এটি নিয়মিত ফাইল কিনা তা পরীক্ষা করে দেখুন

- ফাইলটি উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখি

আরও তথ্যের জন্য পরিচয়

সম্পাদনা: -এফ-এর সাথে ব্যবহার করা নিরর্থক, সুতরাং -f ব্যবহার করেও কাজ করা উচিত


-aঅবচয় করা হয়েছে, -eপরিবর্তে ব্যবহার করুন।
এমজিকার্ড

আমার খারাপ, স্থির ধন্যবাদ @ এমজিচিকার্ড
পি 1 কচু

এটি ডিরেক্টরি বা লিঙ্কগুলি বা অন্যান্য অ-নর্মাল ফাইলগুলিতে ত্রুটি ফেলে দেবে। এটি ইমো আরও ভাল / ব্যবহার করা নিরাপদ -f
জিন্দ্র হেল্ক

1
ঠিক আছে. এখনও -eমধ্যে -feঅপ্রয়োজনীয়, যেমন -fযতদূর আমি জানি চেক ফাইলের অস্তিত্ব ..
Jindra Helcl

যদি আমি সম্পাদনা করি, আমি আপনার উত্তরটি থেকে কেবল একটি অনুলিপি তৈরি করব, তবে আমি এটি সুনির্দিষ্ট করব
P1kachu

4

if [ $( ls <file> ) ]; then rm <file>; fi

এছাড়াও, আপনি যদি এর >পরিবর্তে আপনার আউটপুট পুনর্নির্দেশ করেন >>তবে পূর্ববর্তী ফাইলটি ওভাররাইট হবে


3
এটি কোনও ওয়ানলাইনার নয়, দুঃখিত, তবে @ লিউপ_এসটিফেনটি হ'ল।
fiorentinoing

এমনকি যদি যথাযথভাবে উদ্ধৃত করা fileহয় তবে এটি কিছুটা হলেও ভেঙে যায়5 -lt 2
উইলিয়াম পার্সেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.