अगर बैश में कोई फ़ाइल खाली है तो कैसे जांचें?


184

मेरे पास एक फाइल है जिसका नाम diff.txt है। खाली होने पर जांच करना चाहते हैं। ऐसा कुछ किया, लेकिन यह काम नहीं कर सका।

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

24
[-s फ़ाइल] सही है अगर फ़ाइल मौजूद है और आकार शून्य से अधिक है। इस प्रकार, यदि "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
एलेजैंड्रो ब्लास्को

जवाबों:


225

गलतफहमी परेशान कर रहे हैं, वे नहीं हैं? अपनी वर्तनी की जाँच करें 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इसके बजाय बस करो ।
लिलिथ

अच्छा! यदि आप सभी 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इसके बजाय का उपयोग करें ; कृपया इस बैश नुकसान पेज को पढ़ें ; और कृपया इस तरह से एंटीपैटर्न फैलाना बंद करें।
ग्नौरफ_गनीउरफ

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

यह जाँचने के लिए कि फ़ाइल खाली है या केवल सफेद स्थान हैं , आप grep का उपयोग कर सकते हैं:

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

यह एकमात्र अच्छा उत्तर है और इसे स्वीकार किया जाना चाहिए। उपयोग -sकरने से प्रश्न का उत्तर नहीं मिलता है। यह एक ऐसी फ़ाइल की तलाश करता है जो मौजूद है और जिसका आकार 0 से अधिक बाइट्स है।
Akito

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फ़ाइलों को कैसे हटाया जाए क्योंकि वे पायथन 3.3+ में निहित हैं और इसका उपयोग कर समाप्त हो गए हैं:

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

इसके अलावा (कम से कम zsh में) $ पथ का उपयोग करते हुए चर भी आपके $ PATH env को तोड़ता है और इसलिए यह आपके खुले शेल को तोड़ देगा। वैसे भी, सोचा था कि मैं साझा करेंगे!


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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.