বাশ-এ কোনও ফাইল ফাঁকা আছে কিনা তা কীভাবে পরীক্ষা করবেন?


183

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

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi

24
[-s ফাইল] সত্য যদি FILE উপস্থিত থাকে এবং আকারটি শূন্যের চেয়ে বড় হয়। সুতরাং, "diff.txt" খালি না থাকলে আপনি "খালি। টেক্সট" পাবেন।
ম্যাথিয়াস

2
পিএস: আপনি যদি কোনও আসল diffকল পরীক্ষা করতে চান তবে কেবল ফেরতের মানটি পরীক্ষা করুন:if diff foo.txt bar.txt; then echo 'No difference'
l0b0

20
পরীক্ষা অবহেলা করা যায়:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
ডেভিড রামিরেজ

পেছনের নতুন-লাইন অক্ষর সম্পর্কে সাবধান থাকুন। ফাইলটি পরীক্ষা করে দেখুন$ cat diff.txt | hexdump -C
আলেজান্দ্রো ব্লাস্কো

উত্তর:


224

ভুল বানান বিরক্তিকর, তাই না? আপনার বানানটি পরীক্ষা করুন empty, তবে তারপরেও এটি ব্যবহার করে দেখুন:

#!/bin/bash -e

if [ -s diff.txt ]
then
        rm -f empty.txt
        touch full.txt
else
        rm -f full.txt
        touch empty.txt
fi

আমি শেল স্ক্রিপ্টিং অনেক পছন্দ করি তবে এর একটি অসুবিধা হ'ল আপনি ভুল বানান করার সময় শেল আপনাকে সাহায্য করতে পারে না, তবে আপনার সি ++ সংকলকের মতো সংকলক আপনাকে সহায়তা করতে পারে।

লক্ষ্য করুন প্রসঙ্গক্রমে আমি ভূমিকা অদলবদল যে empty.txtএবং full.txt, যেমন @Matthias দাড়ায়।


6
শেলটি ভুল বানান নিয়ে সহায়তা করতে পারে। empty=empty.txt; full=full.txt; diff=diff.txt; if [ -s ${diff?} ]; then r=${empty?} t=${full?}; else r=${full?} t=${empty?}; fi; rm ${r?}; touch ${t?}
উইলিয়াম পার্সেল

1
সরঞ্জাম শেলচেক ব্যবহার করা বানান ত্রুটি ঠিক ঠিক খুঁজে পেতে পারে।
ইয়োকাই

1
ফাইলটি না থাকলে অবশ্যই এটি ব্যর্থ হবে? কেবলমাত্র ফাইলটি খালি থাকলে এটি চেক হওয়ার কথা।
geedoubleya

@ গিডোবল্যা: অবশ্যই এটি একটি যুক্তিসঙ্গত বিষয়। যদি ফাইলটির অস্তিত্ব প্রাসঙ্গিক হয় (যেমন, অবশ্যই এটি হতে পারে), তবে কেউ সেই অনুযায়ী স্ক্রিপ্টটি সামঞ্জস্য করতে পারে। আপনি যদি উত্তর হিসাবে সামঞ্জস্য স্ক্রিপ্টটি দেন এবং আমাকে পিন করেন তবে আমি উপরে উঠব।
thb

1
আপনিও করতে পারেনset -u
জন ম্যাকক্ল্যাং


53

[[-s ফাইল]] -> ফাইলের আকার 0 এর চেয়ে বেশি আছে কিনা তা পরীক্ষা করে

if [[ -s diff.txt ]]; then echo "file has something"; else echo "file is empty"; fi

প্রয়োজনে এটি বর্তমান ডিরেক্টরিতে সমস্ত * .txt ফাইল পরীক্ষা করে; এবং সমস্ত খালি ফাইল রিপোর্ট:

for file in *.txt; do if [[ ! -s $file ]]; then echo $file; fi; done

3
আপনার করার দরকার নেই $(ls *.txt, এবং আসলে করা উচিত নয়। কিছু লোকের জন্য ডিফল্টগুলি সেট করা থাকে তার জন্য lsদীর্ঘ ফর্ম্যাটটি ব্যবহার করুন (আমার মতো) এবং শেলটি ইতিমধ্যে *.txtনিজের থেকেই প্রসারিত হবে । কেবল for file in *.txtপরিবর্তে না।
লিলিথ

নিস! আপনি যদি সমস্ত টিএসটি ফাইল পুনরাবৃত্তভাবে পরীক্ষা করতে চান তবে আপনি এটি ব্যবহার করতে পারেন find:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM

1
কেবল এই ভয়াবহ অ্যান্টি-প্যাটার্নের কারণে হতাশ for file in $(ls *.txt); dofor file in *.txt; doপরিবর্তে ব্যবহার করুন; দয়া করে এই ব্যাশ পিটফলস পৃষ্ঠাটি পড়ুন ; এবং দয়া করে এন্টিপ্যাটার্নগুলি ছড়িয়ে দেওয়া বন্ধ করুন।
gniourf_gniourf 23'19

8

অন্যান্য উত্তরগুলি সঠিক হলেও "-s"অপশনটি ব্যবহার করে ফাইলটি উপস্থিত না থাকলেও ফাইলটি খালি রয়েছে তা দেখাবে। ফাইলটি আগে উপস্থিত রয়েছে কিনা তা দেখার জন্য
এই অতিরিক্ত চেক যুক্ত করে "-f", আমরা ফলাফলটি সঠিক কিনা তা নিশ্চিত করি।

if [ -f diff.txt ]
then
  if [ -s diff.txt ]
  then
    rm -f empty.txt
    touch full.txt
  else
    rm -f full.txt
    touch empty.txt
  fi
else
  echo "File diff.txt does not exist"
fi

4

@geedoubleya উত্তর আমার প্রিয়।

যাইহোক, আমি এই পছন্দ না

if [[ -f diff.txt && -s diff.txt ]]
then
  rm -f empty.txt
  touch full.txt
elif [[ -f diff.txt && ! -s diff.txt ]]
then
  rm -f full.txt
  touch empty.txt
else
  echo "File diff.txt does not exist"
fi

3

ফাইলটি খালি আছে কিনা বা কেবল সাদা স্পেস রয়েছে কিনা তা পরীক্ষা করতে আপনি গ্রেপ ব্যবহার করতে পারেন:

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi

এটিই একমাত্র ভাল উত্তর এবং এটি গ্রহণযোগ্য হওয়া উচিত। ব্যবহার করা -sপ্রশ্নের প্রশ্নের উত্তর দেয় না। এটি এমন কোনও ফাইলের সন্ধান করে যা বিদ্যমান এবং এটির আকার 0 বাইটের বেশি।
আকিতো

2

উত্তরগুলির অনেকগুলি সঠিক তবে আমার মনে হয় এগুলি আরও সম্পূর্ণ / সরল ইত্যাদি হতে পারে উদাহরণস্বরূপ:

উদাহরণ 1: বুনিয়াদী যদি বিবৃতি

# BASH4+ example on Linux :

typeset read_file="/tmp/some-file.txt"
if [ ! -s "${read_file}" ]  || [ ! -f "${read_file}" ] ;then
    echo "Error: file (${read_file}) not found.. "
    exit 7
fi

যদি $ read_file ফাঁকা থাকে বা প্রস্থান না করে শো বন্ধ করে দেয়। আমি একাধিকবার বিপরীতটি বোঝাতে এখানে শীর্ষ উত্তরগুলি ভুলভাবে লিখেছি।

উদাহরণ 2: একটি ফাংশন হিসাবে

# -- Check if file is missing /or empty --
# Globals: None
# Arguments: file name
# Returns: Bool
# --
is_file_empty_or_missing() {
    [[ ! -f "${1}" || ! -s "${1}" ]] && return 0 || return 1
}


0

আমি এখানে খালি __init__.pyফাইলগুলি কীভাবে পাইথন ৩.৩+ তে অন্তর্ভুক্ত রয়েছে তা মুছতে এবং এখানে এসে শেষ করে:

find -depth '(' -type f  -name __init__.py ')' -print0 |
  while IFS= read -d '' -r file; do if [[ ! -s $file ]]; then rm $file; fi; done

এছাড়াও (কমপক্ষে zsh এ) ভেরিয়েবল হিসাবে $ পাথ ব্যবহার করে আপনার AT PATH এনভিলিটিও ভেঙে দেয় এবং এটি আপনার উন্মুক্ত শেলটি ভেঙে দেবে। যাইহোক, ভেবেছি আমি ভাগ করে নেব!


0

ফাইল চেক করার সহজ উপায়টি খালি বা না:

if [ -s /path-to-file/filename.txt ]
then
     echo "File is not empty"
else
     echo "File is empty"
fi

আপনি এটি একক লাইনেও লিখতে পারেন:

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.