শেল স্ক্রিপ্ট - <তারিখের পরে সমস্ত ফাইল সংশোধিত করুন


136

আমি পিএইচপি-তে বরং এটি করব না তাই আমি আশা করছি যে শেল স্ক্রিপ্টিংয়ের কোনও শালীন কেউ সহায়তা করতে পারে।

আমার একটি স্ক্রিপ্ট দরকার যা ডিরেক্টরিতে পুনরাবৃত্তি করে চলে এবং সর্বশেষ পরিবর্তিত তারিখের সাথে সমস্ত ফাইলের চেয়ে কিছু তারিখের চেয়ে বড়। তারপরে, এটি পথের তথ্য রাখার সাথে সাথে ফাইলগুলি গুলি ও জিপ করবে।


14
পিএইচপি-তে এটি না করার ভাল সিদ্ধান্ত।
ক্রেডেন্স

1
আপনি পিএইচপি ব্যবহার না করে যে কোনও শেল স্ক্রিপ্টিং ভাষা যেমন অজগর, রুবি, পার্ল ব্যবহার করতে পারেন।
গারো

3
@ গ্রারো এটি ফিল্টারইটরেটারে এনকাসপুলেটেড একটি রিক্রুসিভ ডাইরেক্টরিআইটরেটর ব্যবহার করে পিএইচপিতে আসলে মোটামুটি সহজ হবে।
আর্টেফ্যাক্টো

উত্তর:


136

মতই সহজ:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

যেখানে find . -mtime -1আগে (যাও recursively) বর্তমান ডিরেক্টরির পরিবর্তিত দিনে সব ফাইল নির্বাচন করব। আপনি ভগ্নাংশ ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz

4
আপনার ফাইলের নামগুলিতে শূন্যস্থান কীভাবে মোকাবেলা করতে পারেন তার জন্য নীচে ব্যবহারকারীর 104848 এর উত্তর দেখুন
ব্রায়ান হেন্ক

8
একটি স্বেচ্ছাসেবী টাইমস্ট্যাম্পকে ভগ্নাংশ, আপেক্ষিক পরিমাণে রূপান্তর করা সঠিক বা বিশেষভাবে সুবিধাজনক বলে মনে হয় না। ব্যবহার করার সময় নীচের সমাধান -newermtহয় অনেক সুন্দর।
ববি জ্যাক

5
ডিরেক্টরি সহ কোনও কাঠামোর পরিবর্তন সহ কোনও ফাইল বের করার চেষ্টা করার সময় ডিরেক্টরিগুলি নিজেরাই সংশোধিত হিসাবে পুরো ফোল্ডারটি সংরক্ষণাগারভুক্ত হয়। যোগ -type fশুধুমাত্র ফাইল নির্বাচন করা। এটি ফোল্ডার কাঠামো বজায় রাখে তবে পরিবর্তিত ফাইলগুলির ব্যাক আপ রাখে।
ব্রেন্ট

1
@ ব্রায়ান হেইঙ্ক ব্যবহারকারী ১০৪৪৮৮ তাদের নাম পরিবর্তন করেছেন, আমি নিশ্চিত যে আপনি এই উত্তরটি (বর্তমানে) জেসন লুথারের কাছ থেকে
বোঝাচ্ছেন

4
প্রশ্নটি একটি স্বেচ্ছাসেবী তারিখ দ্বারা ফাইলগুলি সন্ধান করতে বলে। এই উত্তরটি কীভাবে অতীতের এক স্বেচ্ছাসেবী সংখ্যা দ্বারা ফাইলগুলি সন্ধান করতে পারে। আমি মনে করি না যে কোনও তারিখকে একটি দিন বদ্বীপে রূপান্তর করার জন্য একটি পদক্ষেপ যুক্ত না করেই এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
চিহ্নিত করুন

91

আপনার যদি জিএনইউ থাকে findতবে প্রাসঙ্গিক বিকল্পগুলির একটি দল রয়েছে। একমাত্র ছদ্মবেশটি হ'ল তাদের কাছে ইন্টারফেসটি তারার চেয়ে কম:

  • -mmin n (মিনিটের মধ্যে পরিবর্তনের সময়)
  • -mtime n (দিনের মধ্যে পরিবর্তনের সময়)
  • -newer file (ফাইলের পরিবর্তনের সময়ের চেয়ে পরিবর্তনের সময় নতুন)
  • -daystart (বর্তমান সময় থেকে দিনের শুরুতে শুরুর সময় সামঞ্জস্য করুন)
  • অ্যাক্সেস সময় এবং 'পরিবর্তন' বা 'তৈরি' সময় জন্য প্লাস বিকল্প।

শক্ত অংশটি একটি সময় থেকে মিনিটের সংখ্যা নির্ধারণ করছে।

বিবেচনা করার মতো একটি বিকল্প: touchপ্রয়োজনীয় সংশোধন সময় স্ট্যাম্প সহ একটি ফাইল তৈরি করতে ব্যবহার করুন ; তারপর ব্যবহার findসঙ্গে -newer

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

এটি 2009-01-03T12: 31: 43 এর চেয়ে নতুন ফাইলগুলির সন্ধান করে। স্পষ্টতই, কোনও স্ক্রিপ্টে, /tmp/wotsitপিআইডি সহ একটি নাম বা এটি অন্যরকম করার জন্য অন্য মান হতে পারে; এবং trapএটি নিশ্চিত করতে একটি হবে যে এটি ব্যবহারকারী মুছে ফেলা হয় এমনকি যদি এবং আরও অনেক কিছু পরে।


65
পরিবর্তে, আপনি -newermt '2009-01-03T12:31:43'কেবল রেফারেন্সের জন্য কোনও ফাইল তৈরি করার প্রয়োজন এড়াতে ব্যবহার করতে পারেন ।
মাইকেল মায়ার

@ মিশেলমিয়ার: আকর্ষণীয় - ম্যাকোস এক্স 10.7.2 সমর্থন করে 'ফাইন্ড' সমর্থন করে -newermt( -newerXYএকাধিক বিকল্প রয়েছে বলে এটি নথিভুক্ত ; এক্স = এম, ওয়াই = টি এই ক্ষেত্রে)। আমি ব্যবহার করি (প্রায় প্রত্নতাত্ত্বিক) লিনাক্স সিস্টেমগুলিতে জিএনইউ অনুসন্ধানগুলি বিকল্পগুলি সমর্থন করে না, সুতরাং এটি তুলনামূলকভাবে সাম্প্রতিক আগমন। সতর্ক থাকুন জন্য ধন্যবাদ।
জোনাথন লেফলার

এই বিকল্পটি জিএনইউতে ৪.৪.২ অনুসন্ধানে উপস্থিত রয়েছে যা আমি আমার সিস্টেমে ব্যবহার করছি।
মাইকেল মায়ার

2
এছাড়াও নোট করুন যে GNU অনুসন্ধান আপেক্ষিক সময়গুলিও সমর্থন করে, যেমন। -newermt '-2 weeks'
সাইবলিক

1
-newermt '2009-01-03T12:31:43'সন্ত্রস্ত দেখায়, কিন্তু দুঃখিতভাবে এটা ভুল সময় অঞ্চল সবকিছু ব্যাখ্যা করা বলে মনে হয়: lists.gnu.org/archive/html/bug-findutils/2012-12/msg00009.html
Antoine

35

আপনি সরাসরি তার সাথে এটি আরও ভাল করতে পারেন:

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

এই 1 জানুয়ারী 2014, 18:00:00 এর চেয়েও বেশি নতুন ফাইলগুলিকে সংকুচিত করতে টারকে নির্দেশ দেয়।


9
হু ... আমি 1984 সাল থেকে ইউনিক্স ব্যবহার করে আসছি এবং এটি কখনই জানতাম না। সর্বদা কিছু শিখতে হবে।
জন

এর বাস্তবায়নের tarযা OS X এবং FreeBSD 'র শুধুমাত্র সমর্থন সঙ্গে আসা --newer, যার জন্য দীর্ঘ বিকল্প -Nগনুহ মধ্যে tar
নিসেতামা

এটি দুর্দান্ত ... আমি কেবল এটি bzip এর সাথে কাজ করতে পারি, -xcvf এবং একটি জিজেড এক্সটেনশন ব্যবহার না করে ... তবে আমি কোনও বিশেষজ্ঞ নই।
ফিল

17

এটি কয়েকটি সংখ্যক ফাইলের জন্য কাজ করবে। কোনও পাথের ফাঁকির ক্ষেত্রে আপনি "-প্রিন্ট 0" এবং "xargs -0" অন্তর্ভুক্ত করতে চান। এই উদাহরণটি গত 7 দিনে পরিবর্তিত ফাইলগুলির সন্ধান করে। গত 7 দিনের আগে এগুলি সংশোধিতদের সন্ধান করতে "+7" ব্যবহার করুন।

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

যেমন এই পৃষ্ঠায় সতর্ক করা হয়েছে, xargs প্রচুর যুক্তি থাকলে একাধিকবার টার্ম কমান্ড কার্যকর করতে পারে এবং "-c" পতাকাটি সমস্যার কারণ হতে পারে। সেক্ষেত্রে আপনি এটি চাইবেন:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

আপনি টর্কের সাথে একটি জিপড টার সংরক্ষণাগারটি আপডেট করতে পারবেন না, তাই আপনাকে দ্বিতীয় ধাপে bzip2 বা gzip করতে হবে।


1
দ্বিতীয় বিষয়টির বিষয়ে, আপনি জিপড সংরক্ষণাগারগুলি আপডেট করার জন্য, জিএনপি-সক্ষম ট্যারি কমান্ড, যেমন গ্নু টার -Z বিকল্প ব্যবহার করতে পারেন।
সানকাট 2000

অথবা সাম্প্রতিক গনুহ tars ব্যবহারের bzip করতে 'ঞ' বিকল্পটি যোগ
HD1

3
আমি জোনাথনের উত্তরে উপরে যেমন বলেছি, এটি ফোল্ডারগুলিকে দখল করবে যার ফলে তাদের সমস্ত ফাইল আমদানি করা হচ্ছে changes যোগ -type fশুধুমাত্র ফাইল নির্বাচন করা। এটি ফোল্ডার কাঠামো বজায় রাখে তবে সম্প্রতি পরিবর্তিত / যুক্ত হওয়া ফাইলগুলিকে ব্যাক আপ করে।
ব্রেন্ট

12

এটি গত 7 দিনের মধ্যে সংশোধিত সমস্ত ফাইল দেখানো উচিত।

find . -type f -mtime -7 -print

পাই / ট্যাপ / জিপ মধ্যে পাইপ, এবং আপনি ভাল হওয়া উচিত।


3

লিনাক্সের অধীনে ফাইন্ড কমান্ডের ম্যান পৃষ্ঠা পড়ার চেষ্টা করুন

man find

এই মত কিছু করা উচিত

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

এবং আপনি এটি আছে


3

আপনি x দিন আগে এর পরে শেষ বার সংশোধিত ফাইলগুলির একটি তালিকা পেতে পারেন:

find . -mtime -x

তারপরে আপনাকে ফলাফলের তালিকায় কেবল ফাইলগুলি জিপ করতে হবে, উদাহরণস্বরূপ:

tar czvf mytarfile.tgz `find . -mtime -30`

সমস্ত ফাইলের জন্য গত মাসে সংশোধিত।


3
"-মটাইম এক্স" ফাইলগুলি ঠিক "x" দিন আগে সংশোধিত ফাইলগুলির সাথে মেলে, "x" দিন আগে আগের পরিবর্তিত ফাইলগুলির সাথে "-মটাইম-এক্স" ব্যবহার করুন।
ল্যান্স রিচার্ডসন

3

আমি 7 দিন আগে সমস্ত নতুন ফাইলের ব্যাকআপ নেওয়ার জন্য কেবল নিম্নলিখিতটি করব

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

নোট আপনি আপনার প্রয়োজন অনুসারে যে কোনও কিছু সঙ্গে '7 দিন আগে' প্রতিস্থাপন করতে পারেন

হতে পারে : date -d'yesterday' +"%d-%b"

অথবা এমনকি : date -d'first Sunday last month' +"%d-%b"


2

এই স্ক্রিপ্টটি প্রদত্ত তারিখের আগে এবং পরে দুই মিনিটের পরিবর্তনের তারিখযুক্ত ফাইলগুলি খুঁজে পাবে (এবং আপনি নিজের প্রয়োজন অনুসারে শর্তগুলির মানগুলি পরিবর্তন করতে পারেন)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

উদাহরণস্বরূপ, আপনি সামনে প্রদত্ত তারিখের শুধুমাত্র, আপনি পরিবর্তন হতে পারে পরিবর্তনের তারিখ থাকার ফাইল প্রাপ্ত করতে ইচ্ছুক 120করার 0মধ্যে $DIFF_IN_DATEপ্যারামিটারের অবস্থার খারিজ $DIFF_IN_DATE1প্যারামিটার।

একইভাবে আপনি পরিবর্তনের তারিখ থাকার ফাইল 1 ঘন্টা আগে এবং প্রদত্ত তারিখের পরে, শুধু প্রতিস্থাপন চান তাহলে 120দ্বারা 3600মধ্যে if CONDITION

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