अस्थायी निर्देशिका कैसे बनाएं?


229

मैं एक बनाने tempfile, इसे हटाने और एक निर्देशिका के रूप में इसे फिर से बनाने के लिए उपयोग करता हूं :

tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"

समस्या यह है कि, एक अन्य प्रक्रिया को एक ही नाम मिल सकता है X, अगर यह गलती से एक प्रक्रिया के बाद rm -f Xऔर कुछ समय पहले टेम्पोफाइल निष्पादित करता है mkdir X

जवाबों:


341

का उपयोग करें mktemp -d। यह एक यादृच्छिक नाम के साथ एक अस्थायी निर्देशिका बनाता है और यह सुनिश्चित करता है कि फ़ाइल पहले से मौजूद नहीं है। हालाँकि इसे उपयोग करने के बाद निर्देशिका को हटाने के लिए आपको याद रखना होगा।


25
मैं का इस्तेमाल किया थाmktemp -d -t <prefix>
हीथ बॉर्डर्स

17
यह एक OS X बनाम लिनक्स चीज है। इस सवाल को एक ऐसे संस्करण के लिए देखें जो दोनों पर काम करता है: unix.stackexchange.com/questions/30091/…
jwhitlock

2
इसके अलावा, ऑर्टविन द्वारा नीचे दिए गए उत्तर को देखें, क्योंकि यह सुनिश्चित करता है कि सफाई भी की गई है।
मैथियासडम

5
आप यह क्यों कहते हैं कि "हालांकि इसका उपयोग करने के बाद निर्देशिका को हटाने के लिए आपको याद रखने की आवश्यकता है?" कि थोड़े अस्थायी निर्देशिका का उपयोग करने के उद्देश्य को नहीं हराता है?
एमके सफी

73

अधिक मजबूत समाधान के लिए मैं निम्नलिखित जैसे कुछ का उपयोग करता हूं। इस तरह से स्क्रिप्ट से बाहर निकलने के बाद अस्थायी डायर को हमेशा के लिए हटा दिया जाएगा।

क्लीनअप फ़ंक्शन को निष्पादित किया जाता है EXITसिग्नल है। यह गारंटी देता है कि क्लीनअप फ़ंक्शन हमेशा कहा जाता है, भले ही स्क्रिप्ट कहीं गर्भपात करता हो।

#!/bin/bash    

# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`

# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
  echo "Could not create temp dir"
  exit 1
fi

# deletes the temp directory
function cleanup {      
  rm -rf "$WORK_DIR"
  echo "Deleted temp working directory $WORK_DIR"
}

# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT

# implementation of script starts here
...

बैश स्क्रिप्ट की निर्देशिका यहाँ से

बैश जाल


26
FreeBSD सावधानी! FreeBSD पर mktemp के पास -p विकल्प नहीं है, और आपकी वर्तमान निर्देशिकाcleanup को rm -rf
मैत्री

1
अच्छा बिंदु, यह जांचने के लिए स्क्रिप्ट को अपडेट किया गया कि क्या अस्थायी डीआईआर बनाया जा सकता है।
ऑर्टविन एंगर्मियर

1
@ कामचोर वास्तव में? यदि mktempविफल रहता है, तो WORK_DIRखाली हो जाएगा, जिसका अर्थ है कि कमांड सिर्फ rm -rfबिना किसी तर्क के होगा। मैं FreeBSD का उपयोग नहीं करता, लेकिन मुझे बहुत आश्चर्य होगा अगर rm -rfबराबर थाrm -rf .
jbg

@jbg हाँ, यह मुझे अब भी अजीब लगता है - यह वास्तव में बड़ी समस्या नहीं होनी चाहिए। हो सकता है कि मैंने इस स्क्रिप्ट के पुराने संस्करण को बदल दिया हो ताकि अस्थायी निर्देशिका के लिए पथ की गणना वर्तमान निर्देशिका से अपेक्षाकृत की जा सके, जिसके परिणामस्वरूप <s> मानव जाति का विलोपन हो सकता है।
मैडल

1
इसे बेहतर बनाने के लिए, आप एक खाली निर्देशिका से बच सकते हैं या कम से कम एक निर्देशिका के भीतर समस्या को हल कर सकते हैं जहां आप करते हैं: 1. TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')और फिर 2 rmdir /tmp/git/"${TMPWORKDIR}".। यदि चर अब खाली है, तो आप अभी भी /tmp/git/पूरे सिस्टम में वापस नहीं आएंगे । उत्तर में कुछ इस तरह से विचार करें और मैं सहर्ष सहमत हो जाऊंगा। ;)
डॉ। बनो

64

इसके लिए मेरा पसंदीदा वन-लाइनर है

cd $(mktemp -d)

10
और rm $(pwd)? : पी
अरन कडबार्ड-बेल

19
यह भी उपयोगी है: pushd $(mktemp -d)...popd
पोंकडूडल

4
@ ArranCudbard-Bell होना चाहिएrm -r $(pwd)
piggybox

31
@piggybox सच कहूँ तो, मैं उपयोग करने से बहुत सतर्क रहूँगा rm -r $(pwd)। इस संभावना पर विचार करें कि अस्थायी निर्देशिका निर्माण किसी भी कारण से विफल हो जाता है (शायद / tmp फाइलसिस्टम भरा हुआ है या केवल एक त्रुटि के कारण पढ़ा गया है;); फिर cd $(mktemp -d)मूल्यांकन करेगा cdकि उपयोगकर्ता की होम डाइरेक्टरी में कौन से परिवर्तन हैं, जिन्हें बाद में हटा दिया जाएगा।
जूल्स

1
यह सुरक्षित हो सकता हैif pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
एंड्रीस शेरेबकोव

9

निम्नलिखित स्निपेट सुरक्षित रूप से एक अस्थायी निर्देशिका ( -d) बनाएंगे और इसमें अपना नाम स्टोर करेंगे TMPDIR। (एक उदाहरण का उपयोगTMPDIR चर का बाद में उस कोड में दिखाया गया है जहां इसका उपयोग मूल फ़ाइलों को संग्रहीत करने के लिए किया जाता है जिन्हें संभवतः संशोधित किया जाएगा।)

निर्दिष्ट संकेतों में से कोई भी प्राप्त होने पर पहली trapपंक्ति exit 1कमांड निष्पादित करती है। दूसरी पंक्ति कार्यक्रम के निकास (सामान्य और असामान्य दोनों ) पर निकालती है (साफ करती है)। हम जांच के बाद इन जालों को आरंभ करते हैं जो किसी अज्ञात स्थिति में गलती से बाहर निकलने के जाल को निष्पादित करने से बचने में सफल रहे ।trap$TMPDIRmkdir -d$TMPDIR

#!/bin/bash

# Create a temporary directory and store its name in a variable ...
TMPDIR=$(mktemp -d)

# Bail out if the temp directory wasn't created successfully.
if [ ! -e $TMPDIR ]; then
    >&2 echo "Failed to create temp directory"
    exit 1
fi

# Make sure it gets removed even if the script exits abnormally.
trap "exit 1"           HUP INT PIPE QUIT TERM
trap 'rm -rf "$TMPDIR"' EXIT

# Example use of TMPDIR:
for f in *.csv; do
    cp "$f" "$TMPDIR"
    # remove duplicate lines but keep order
    perl -ne 'print if ++$k{$_}==1' "$TMPDIR/$f" > "$f"
done

1
हालांकि यह त्रुटि से निपटने के लिए एक दिलचस्प समाधान है, फायदे और संभावित कमियों का थोड़ा और स्पष्टीकरण अच्छा होगा।
मर्फी

1.) -dनिर्देशिकाओं के लिए जाँच। 2.) समाप्ति उन संकेतों के लिए पहले से ही डिफ़ॉल्ट है।
14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.