একটি ভেরিয়েবল থেকে একটি ফাইলের নামে একটি বর্তমান তারিখ যুক্ত করা


55

আমি এই তারিখের মতো একটি ফাইল নামের শেষে বর্তমান তারিখ যুক্ত করার চেষ্টা করছি:

TheFile.log.2012-02-11

আমার এখন পর্যন্ত যা আছে তা এখানে:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

তবে আমি যা পাই তা হ'ল ফাইলটির নাম এবং এটি কিছুই সংযোজন করে না। আমি কীভাবে একটি ফাইলের নামের সাথে বর্তমান তারিখ যুক্ত করব?


আপনি যখন অ্যাপপ্যান্ডের তারিখটি ব্যবহার করবেন না তা নিশ্চিত করুন :কারণ এটি তখন আরএসসিএনসি এবং স্কিপিতে হোস্ট হিসাবে পড়বে। stackoverflow.com/a/37143274/390066
kirill_igum

উত্তর:


78

সম্ভবত এটি আপনার ব্যবহার set। এটি 'আজ', '=' এবং dateপ্রোগ্রামের আউটপুটকে পজিশনাল প্যারামিটারগুলিতে (ওরফে কমান্ড-লাইন আর্গুমেন্ট) বরাদ্দ করবে । আপনি কেবল সি শেল ব্যবহার করতে চান (যা আপনি এটি "বাশ" হিসাবে ট্যাগ করছেন, সম্ভবত এটি নয়), আপনি ব্যবহার করতে চাইবেন:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

সমান চিহ্নের চারপাশে জায়গার অভাব লক্ষ্য করুন Notice

আপনি &আপনার বিবৃতি শেষে ব্যবহার করতে চান না ; যার ফলে শেলটি কমান্ডটি শেষ হওয়ার অপেক্ষায় না। বিশেষত যখন কেউ পরেরটির উপর নির্ভর করে। findকমান্ড ব্যর্থ হওয়ার কারণে এটা আগে শুরু হয় mkdir


সেই সাথীর জন্য ধন্যবাদ, এখন এটির কাজ 100% জরিমানা, মাথা উঁচু করে & mkdir এর জন্য চিয়ার্স
I L L

55

ফাইলের নামতে একটি তারিখ ইনজেক্ট করতে স্ক্রিপ্টটি বাশ করুন:

এই বাশ কোডটি ফাইলে ডেকে আনে a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

চালানো হলে, মুদ্রণ:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

কোডের ব্যাখ্যা:

স্ক্রিপ্টটিকে / বিন / ব্যাশ ইন্টারপ্রেটার দিয়ে ব্যাখ্যা করুন। আজকে নতুন একটি পরিবর্তনশীল তৈরি করুন। আউটপুট কনফিগার করতে Y, m, d, H, M, S পতাকাগুলিতে পাস করে ডেট কমান্ড কার্যকর করুন। ফলাফল তারিখের পরিবর্তনশীল মধ্যে রাখুন।

ফাইলের নাম নামে একটি নতুন ভেরিয়েবল তৈরি করুন, বাকি স্ট্যাটিক ফাইলনাম পাঠ্যের সাথে $ আজ ভেরিয়েবলকে ঘিরে। তারপরে স্ক্রিনে ফাইলের নামটি প্রতিধ্বনিত করুন।

লুল্জ বাড়ানোর জন্য এটি একটি ওয়ান-লাইনারে ক্র্যাম করুন:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

আপনি বেশ কয়েকটি জিনিস মিশ্রিত করেছেন বলে মনে হচ্ছে।

set today = 'date +%Y'দেখতে tcsh সিনট্যাক্সের মতো, তবে tcsh তেও এটি স্ট্রিংটি date +%Yভেরিয়েবলের জন্য নির্ধারণ করে today, এটি dateকমান্ডটি চালায় না । যেহেতু আপনি সম্ভবত বাশ বা অন্য কোনও পসিক্স শেল ব্যবহার করছেন, একটি অ্যাসাইনমেন্টের বাক্য গঠনটি today=some_value(সমান চিহ্নের চারপাশে কোনও ফাঁকা স্থান নেই)। কমান্ডটি চালাতে এবং এর আউটপুটটি ভেরিয়েবলের কাছে নির্ধারণ করতে, কমান্ড প্রতিস্থাপন ব্যবহার করুন :

today=$(date +%Y-%m-%d)

(আমি তারিখের নির্দিষ্টকরণও শেষ করেছি)। আপনি ডলার-প্রথম বন্ধনী পরিবর্তে backquotes ব্যবহার করতে পারেন, কিন্তু এটা চাক্ষুষরূপে এগিয়ে কোট সঙ্গে গুলিয়ে ফেলা হচ্ছে প্রবণ, এবং যখন আপনি একটি backquoted কমান্ড ভিতরে কোট প্রয়োজন জন্য নিয়ম প্রশংসনীয় জটিল এবং বাস্তবায়ন নির্ভর, তাই এটি বিদ্ধ না ভাল $(…)(যা স্যানার সিনট্যাক্সের সাথে একই প্রভাব রয়েছে)।

আপনি &বেশ কয়েকটি কমান্ডের শেষে ব্যবহার করেছেন। এটি কমান্ডটিকে পটভূমিতে কার্যকর করতে সক্ষম করে, যা এখানে চাইছিল না। আমি সন্দেহ করি যে আপনি বোঝাতে চেয়েছিলেন &&, যার অর্থ প্রথম কমান্ড সফল হলে কেবল পরবর্তী কমান্ড কার্যকর করা।

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

&&প্রতিটি কমান্ডের পরে ব্যবহারের বিকল্প হ'ল আপনার স্ক্রিপ্টটি দিয়ে শুরু করা set -e। এটি শেলটিকে স্ক্রিপ্টটি চালানো বন্ধ করতে বলেছে যে কোনও কমান্ড ননজারো স্থিতি ফেরত দেওয়ার সাথে সাথে ( ifশর্তাবলী এবং অন্যান্য কয়েকটি ক্ষেত্রে কমান্ড বাদে )।

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

আপনার findআদেশটি ঠিক আছে তবে সম্ভবত আপনি যা করতে চান তা করেন না (যদিও এটি কী তা আমি নিশ্চিতভাবে জানি না)।

আপনি একটি ডিরেক্টরি তৈরি করছেন mkdirএবং তারপরে এটির সাথে সাথে ট্র্যাভার করে চলেছেন find। ডিরেক্টরিটি ইতিমধ্যে উপস্থিত না থাকলে এটি কার্যকর হবে না। আপনি কি আজকের লগগুলির জন্য একটি ডিরেক্টরি তৈরি এবং সাম্প্রতিক ফাইলগুলি The_Logsউদাহরণস্বরূপ কোনও ডিরেক্টরিতে স্থানান্তরিত করতে চান The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

বা প্রত্যয় যুক্ত করার জন্য আপনি কি আজকের লগ ফাইলগুলির নাম পরিবর্তন করতে চান $today? এর জন্য প্রতিটি ফাইলের সরানোর জন্য আলাদা ফাইলের নাম গণনা করা দরকার।

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

নোট করুন যে আমি -mtimeফাইলগুলি পরিবর্তনের সময়ের উপর ভিত্তি করে সরিয়ে নিয়েছি -atimeএবং ফাইলটি সর্বশেষ পঠনের সময়টি ছিল না (যদি আপনার সিস্টেম এটির উপর নজর রাখে - যদি তা না হয় তবে সময়টি আগের মতোই ফিরে আসতে পারে) র দ্বারা mtime)।


3

আপনি এতে যুক্ত টাইম স্ট্যাম্পের সাথে ফাইলটির নাম পরিবর্তন করতে পারেন

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`

2

এই:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

কাজ করা উচিত. যদিও, মনে হচ্ছে আপনি সিএসএস ব্যবহার করছেন এবং + চিহ্নটি সরিয়ে দেওয়ার আমার সমাধানটি আপনার পক্ষে কাজ নাও করতে পারে তবে চেষ্টা করে আঘাত করবে না। আপনার ভেরিয়েবলটিকে ly ly কোঁকড়া বন্ধনীতে অন্তর্ভুক্ত করা অপ্রত্যাশিত পরিবর্তনশীল প্রসার রোধ করার জন্য সর্বদা একটি ভাল ধারণা।


সাথী ধন্যবাদ, অন্য উত্তরের সাথে আপনার সংশোধন যোগ করার পরে, এটি ঠিক আছে।
আমি এল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.