यदि यह मौजूद नहीं है तो फ़ाइल बनाने के लिए शेल स्क्रिप्ट?


20

मुझे एक शेल स्क्रिप्ट बनाने की ज़रूरत है जो किसी फ़ाइल की उपस्थिति की जांच करती है और अगर यह मौजूद नहीं है, तो इसे बनाता है और अगले कमांड पर जाता है, या बस अगले कमांड पर जाता है। मेरे पास ऐसा नहीं है।

#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi

# Next command (macOS preference setting)
defaults write ...

वापसी है

line 5: [!: command not found
mkdir: /Scripts: File exists

पता नहीं क्या करना है। Google द्वारा खोजा जाने वाला हर स्थान मुझे कुछ अलग इंगित करता है।


6
अपने कोड को shellcheck.net पर रखें और इसके द्वारा सुझाए गए सुझावों की समीक्षा करें
रोआइमा

12
किसी भी कारण से आप सिर्फ touchफ़ाइल नहीं छोड़ सकते और सशर्त छोड़ सकते हैं?
किरकपट्ट

पता सिंटेक्स त्रुटि (बीच की जगह लापता नीचे अन्य उत्तर [और !), लेकिन यह शायद मददगार है यहाँ का कहना है कि [यूनिक्स पर एक वास्तविक आदेश है। यूनिक्स कमांड को कमांड नाम और उसके तर्कों के बीच कुछ व्हाट्सएप की आवश्यकता होती है। हाँ, यह एक बैश बिलियन है, लेकिन /usr/bin/[अधिकांश सिस्टम पर एक बाइनरी भी है ।
TheDudeAbides

जवाबों:


44

संभवतः सरल समाधान, स्पष्ट परीक्षण करने की आवश्यकता नहीं है, बस उपयोग करें:

mkdir -p /Scripts
touch /Scripts/file.txt

यदि आप मौजूदा के "संशोधन" समय को file.txtबदलना नहीं चाहते हैं touch, तो आप केवल "एक्सेस" और "परिवर्तन" समय को बदलने के touch -a /Scripts/file.txtलिए उपयोग कर सकते हैं touch


1
यदि आप माइम की परवाह नहीं करते हैं, तो आप उपयोग कर सकते हैं >>/Scripts/file.txt। यह फ़ाइल को जोड़ने के लिए खोल देगा और अगर यह मौजूद नहीं है तो इसे बनाएगा।
कोजिरो

30

आपको त्रुटि मिल रही है क्योंकि बीच में कोई जगह नहीं है [और !हालांकि आपके कोड में कुछ खामियां भी हैं। पहले आप देख रहे हैं कि फ़ाइल मौजूद नहीं है या नहीं और अगर आप कुछ नहीं कर रहे हैं। यदि फ़ाइल मौजूद नहीं है, तो आप एक निर्देशिका बना रहे हैं (लेकिन फ़ाइल बनाने के लिए कुछ भी नहीं कर रहे हैं)।

आपको अशक्त ऑपरेशन की आवश्यकता नहीं है, आपको बस करने में सक्षम होना चाहिए:

#! /bin/bash -
if [[ ! -e /Scripts/file.txt ]]; then
    mkdir -p /Scripts
    touch /Scripts/file.txt
fi

[command2]

यह जाँच कर रहा है कि /Scripts/file.txtक्या यह मौजूद नहीं है और यह /Scriptsनिर्देशिका और फिर file.txtफाइल बनाएगा । आप चाहें तो अलग से निर्देशिका के अस्तित्व के लिए भी जाँच कर सकते हैं। साथ ही नोटिस मैं उपयोग कर रहा हूँ -eके बजाय -fके रूप में आप बस एक फ़ाइल है जो के होने की जाँच करने के लिए कहा -eजहां करेंगे -fजांच करता है कि यह एक "नियमित रूप से फ़ाइल" है http://tldp.org/LDP/abs/html/fto। एचटीएमएल


धन्यवाद @roaima, मैंने आपके सुझाव के साथ अपना उत्तर अपडेट कर दिया है।
जेसी_बी

फ़ाइल मौजूद नहीं है लेकिन निर्देशिका क्या करती है?
चींटी

3
@Ant: mkdir -p: यदि कोई पहले से मौजूद है, तो शिकायत किए बिना, सभी आवश्यक निर्देशिकाएँ बनाएँ। ex: mkdir / home / user1 / tmp: इस पदानुक्रम को बनाएगा, इस तथ्य से स्वतंत्र / घर, या / घर / उपयोगकर्ता 1, निर्देशिका पहले से मौजूद थी। स्पर्श किसी मौजूदा फ़ाइल के समय को भी अपडेट करेगा, या कोई फ़ाइल मौजूद नहीं होने पर एक नया बना देगा। एक भी छुटकारा पा सकता है अगर ... तो भाग, क्योंकि यह सिर्फ उन 2 कमांडों को लॉन्च करने के लिए काफी ठीक है, अगर आप उन निर्देशिकाओं को सुनिश्चित करना चाहते हैं और यह फ़ाइल इसके भीतर मौजूद है।
ओलिवियर दुलाक

समझा! स्पष्टीकरण के लिए धन्यवाद :)
Ant

11

साथ शुरू करने के लिए खोल स्क्रिप्ट नहीं है बैश स्क्रिप्ट , तो आपके कोड को अधिक सामान्य बनाना है:

#!/bin/sh

हर Posix सिस्टम में वह फ़ाइल होनी चाहिए; बैश सख्ती से वैकल्पिक है।

यदि निर्देशिका मौजूद है, तो परीक्षण करने की आवश्यकता नहीं है

dir=/Scripts
mkdir -p $dir

यदि यह मौजूद नहीं है तो फ़ाइल बनाने के लिए,

filename=$dir/file.txt
test -f $filename || touch $filename

या यदि आप चाहें,

filename=$dir/file.txt
if [ ! -f $filename ]
then
    touch $filename
fi

6

आपके पास एक वाक्यात्मक त्रुटि है। आप रिक्तियों से पहले और बाद की आवश्यकता होती है [और ]


3
#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
CHECKFILE="/Scripts/file.txt"

CHECKDIR=$( dirname "$CHECKFILE" )

# The directory with the file must exist
mkdir -p "$CHECKDIR"
if [ ! -f "$CHECKFILE" ]; then
    # What to do if the file is not there
fi
touch "$CHECKFILE"

ऊपर मान लिया गया है वहाँ इस तरह के एक बनाने के रूप में नहीं "चाल" हैं कि निर्देशिका कहा जाता है /Scripts/file.txt(जो कर सकता करने के लिए स्क्रिप्ट के लिए मजबूर हमेशा करता है, तो शाखा में प्रवेश करने का एक तरीका हो सकता है)। यदि "फ़ाइल" एक निर्देशिका है, तो -f परीक्षण विफल हो जाएगा और टच कमांड कुछ भी नहीं बदलेगा।


0

मेरा दृष्टिकोण

#!/bin/sh

# input might contains spaces and other characters
FILEPATH="/tmp/some where/the file.blah"

# extract the file + dir names
FILE="`basename "${FILEPATH}"`"
DIR="`dirname "${FILEPATH}"`"

# create the dir, then the file
mkdir -p "${DIR}" && touch "${DIR}/${FILE}"

# show result
ls -l "$FILEPATH"

उत्पादन

  ./dofile.sh
  -rw-r--r-- 1 jmullee jmullee 0 Nov 15 21:23 /tmp/some where/the file.blah


1
यदि फ़ाइल मौजूद है तो आप जाँच नहीं कर रहे हैं
PiedPiper

@ लेप्डपाइपर वह करता है, यह में निहित हैtouchmkdir -p
xenoid

अधिक जाँच के साथ एक ही आईडी लगती है: D = / boot / bork; एफ = fnord; mkdir -p "$ D" && {स्पर्श "$ D / $ F" && echo "ने $ D / $ F OK" बनाया; } || {गूंज "dir '$ D' नहीं बना सका"; }
जूलली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.