অস্থায়ী ডিরেক্টরি কীভাবে তৈরি করবেন?


229

আমি tempfileএটি তৈরি করতে , মুছতে এবং এটি ডিরেক্টরি হিসাবে পুনরায় তৈরি করতে ব্যবহার করি :

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

সমস্যাটি হ'ল, অন্য প্রক্রিয়াটি একই নাম পেতে পারে X, যদি এটি ঘটনাক্রমে এক প্রক্রিয়ার পরে rm -f Xএবং সামান্য আগে টেম্পাইল চালায় mkdir X

উত্তর:


341

ব্যবহার mktemp -d। এটি একটি এলোমেলো নাম সহ একটি অস্থায়ী ডিরেক্টরি তৈরি করে এবং নিশ্চিত করে যে ফাইলটি ইতিমধ্যে বিদ্যমান নেই। ডিরেক্টরিটি যদিও এটি ব্যবহার করার পরে মুছে ফেলা উচিত remember


25
আমাকে ব্যবহার করতে হয়েছিলmktemp -d -t <prefix>
সীমানা

17
এটি একটি ওএস এক্স বনাম লিনাক্স জিনিস। এই সংস্করণটির জন্য এই প্রশ্নটি দেখুন যা উভয় ক্ষেত্রেই কাজ করে: unix.stackexchange.com/questions/30091/…
jwhitlock

2
এছাড়াও, অর্টউইনের নীচের উত্তরটি দেখুন, যেহেতু এটি নিশ্চিত করে যে পরিষ্কার-পরিচ্ছন্নতাও সম্পন্ন হয়েছে।
ম্যাথিয়াসডেম

5
আপনি কেন বলছেন "যদিও ডিরেক্টরিটি এটির পরে ব্যবহার করার পরে মুছে ফেলা উচিত?" এই ধরণের কোনও অস্থায়ী ডিরেক্টরি ব্যবহারের উদ্দেশ্যকে হারাতে পারে না?
এম কে সাফি

73

আরও দৃ solution় সমাধানের জন্য আমি নীচের মতো কিছু ব্যবহার করি। স্ক্রিপ্টটি প্রস্থান করার পরে টেম্প দির সর্বদা মুছে ফেলা হবে।

ক্লিনআপ ফাংশন 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
ফ্রিবিএসডি সাবধান! ফ্রিবিএসডি-তে এমকেটেম্পে -p বিকল্প নেই, এবং আপনার বর্তমান ডিরেক্টরিটি আরএম- আরফ cleanupকরবে !
পাগল বান্ধবী 10

1
গুড পয়েন্ট, অস্থিরতা তৈরি হতে পারে কিনা তা পরীক্ষা করতে স্ক্রিপ্ট আপডেট করেছে updated
অর্টউইন অ্যাংমার্মিয়ার

1
@ বন্ধুত্ব আসলেই? যদি mktempব্যর্থ হয়, WORK_DIRখালি হবে, যার অর্থ হ'ল কমান্ডটি rm -rfকোনও যুক্তি ছাড়াই থাকবে। আমি ফ্রিবিএসডি ব্যবহার করি না তবে আমি rm -rfসমান হয়ে rm -rf .
উঠলে

@ জেবিজি হ্যাঁ, এটি এখন আমার কাছেও অদ্ভুত বলে মনে হচ্ছে - এটি আসলে খুব বড় সমস্যা হওয়া উচিত নয়। আমি এই স্ক্রিপ্টটির একটি পুরানো সংস্করণটি টিক করতে পারি যাতে অস্থায়ী ডিরেক্টরিতে যাওয়ার পথটি তুলনামূলকভাবে বর্তমান ডিরেক্টরিতে গণনা করা যায়, যার ফলে <s> মানবজাতির বিলুপ্তি ঘটে </ s> বর্তমান ডিরেক্টরি মুছে ফেলা।
পাগল বান্ধবী

1
এটিকে আরও উন্নত করতে, আপনি খালি ডিরেক্টরিটি এড়াতে পারেন বা কমপক্ষে একটি সমাধানের মাধ্যমে কোনও সমস্যা সমাধান করতে পারেন যেখানে আপনি যা করছেন: ১ TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')এবং তারপরে ২ rmdir /tmp/git/"${TMPWORKDIR}"। যদি ভেরিয়েবলটি এখন খালি থাকে তবে আপনি এখনও /tmp/git/পুরো সিস্টেমে না ফিরে ফিরে যাবেন । উত্তরে এরকম কিছু বিবেচনা করুন এবং আমি আনন্দের সাথে সম্মত হই। ;)
ডঃ বেকো

64

এটির জন্য আমার প্রিয় ওয়ান-লাইনার

cd $(mktemp -d)

10
এবং rm $(pwd)? : পি
অরণান কুডবার্ড-বেল

19
এছাড়াও দরকারী: pushd $(mktemp -d)...popd
পোনকাদুডেল

4
@ অরণান কুডবার্ড-বেলটি হওয়া উচিতrm -r $(pwd)
পিগিগবক্স

31
@ পিগজিবক্স সত্যই, আমি ব্যবহার সম্পর্কে খুব সতর্ক থাকব rm -r $(pwd)। অস্থায়ী ডিরেক্টরি নির্মাণ যেকোন কারণে ব্যর্থ হওয়ার সম্ভাবনাটি বিবেচনা করুন (সম্ভবত / টিএমপি ফাইল সিস্টেম পূর্ণ হয়েছে বা কেবল একটি ত্রুটির কারণে পড়ার পুনঃস্থাপন করা হয়েছে?); তারপর 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লাইনটি $TMPDIRঅন ​​প্রোগ্রামের প্রস্থান (সাধারণ এবং অস্বাভাবিক উভয় ) মুছে ফেলে (পরিষ্কার করে )। আমরা এই ফাঁদগুলি অজানা অবস্থায় mkdir -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ডিরেক্টরি জন্য চেক। ২) এই সংকেতগুলির জন্য ইতিমধ্যে সমাপ্তি ডিফল্ট।
সিভ করা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.