বছরের ভিত্তিতে ফাইলগুলি কীভাবে সরানো যায়


15

আমার এক বছরের ভিত্তিতে ফাইল সরানো দরকার। আমি findকমান্ডটি ব্যবহার করেছি

find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6

তবে এই কমান্ডটি সফলভাবে সম্পাদন করার জন্য আমার mtimeএখনই সঠিকটি জানতে হবে 470 কেবল একটি অনুমান। এর অর্থ যদি আমি 2012টি দিতে পারি তবে এটি কেবল 2012 এর সাথে সম্পর্কিত ফাইলগুলি দেয়।

সুতরাং কিভাবে আমার পরামর্শ প্রয়োজন

বছরের উপর ভিত্তি করে ফাইলগুলি সন্ধান করুন যেমন 2012 এবং এগুলি অন্য ডিরেক্টরিতে সরিয়ে দিন।

OS release 5.2

FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 

এটির -exec ls ... \;পরিবর্তে ব্যবহার করার কী অর্থ আছে -exec ... +? আপনার জন্য কি এটি খুব পুরানো? যে ক্ষেত্রে find ... -print0 | xargs -0 ls...অনেক দ্রুত হবে।
হউক লেগেছে

আমি আশা করি যে এই প্রশ্নগুলি (এবং উত্তরগুলি) যা কোর্টিলগুলি নিয়ে কাজ করে আমরা অবশ্যই জিএনইউ বা বিএসডি (বা অন্যান্য) ব্যবহারগুলি নিয়ে কাজ করছি কিনা তা নিয়মিতভাবে নির্দিষ্ট করে দেয়।
গোলকধাঁধা

উত্তর:


39

আপনি এর -newermtজন্য বিকল্পটি ব্যবহার করতে চান find:

find /media/WD/backup/osool/olddata/ -newermt 20120101 -not -newermt 20130101

২০১২-এ পরিবর্তনের সময় সহ সমস্ত ফাইল পেতে।

আপনার সন্ধানটি -newermtযদি সমর্থন না করে তবে অফসেট গণনাগুলি রোধ করতে আপনি নিম্নলিখিতগুলি করতে পারেন:

touch -d 20120101 /var/tmp/2012.ref
touch -d 20130101 /var/tmp/2013.ref
find /media/WD/backup/osool/olddata/ -newer /var/tmp/2012.ref -not -newer /var/tmp/2013.ref

1
-নির্মেট পতাকাটি ফাইন্ড কমান্ডে উপলভ্য নয়
ওমিপেনগুইন

এটি অবশ্যই আপনার আরএইচএল এর সাথে পাওয়া একটি পুরানো সংস্করণ হতে পারে? আমি এর উত্তরে একটি বিকল্প সরবরাহ করব
অ্যান্থন

হ্যাঁ এটি এক 5.2
ওমিপেনগুইন

আমি এটি নিই যে এটি আরএইচএল এর সংশোধন, এর নয় find(আমার সংস্করণ ৪.৪.২ রয়েছে)
অ্যান্থন

1
V4.3.3, gnu.org/software/findutils/manual/html_mono/find.html এর পরে সংস্করণ না হওয়া পর্যন্ত নিউমার্ট স্যুইচটি খুঁজে পাওয়া যায় নি ।
SLM

5
touch --date=2011-12-31T23:59:59 start
touch --date=2012-12-31T23:59:59 stop
find / -newer start \! -newer stop -printf %Tx" "%p\\n

-exec ls কোন মানে নেই।


1
-exec ls -lআরও বুদ্ধিমান করে তোলে, এবং আরও অনেক কিছু পরীক্ষার সময়।
একটি সিভিএন

@ মাইকেলKjörling যা findকিছু প্রিন্ট lsকরতে পারে। ঠিক আছে, এক ব্যতিক্রম সহ: অপ্রিয় চরিত্রের অব্যাহতি / উদ্ধৃতি। তবে সাধারণভাবে আউটপুট findসরাসরি বাছাই করা যায়। এলএস এর অকেজো কলগুলি পুরো জিনিসটি দ্রুত করে না।
হউক লেগেছে

পরীক্ষার সময় আমি প্রায়শই বেশ কিছু অনুরূপ ব্যবহার করি (যদিও ব্যক্তিগতভাবে আমি পছন্দ করি -printবা সম্ভবত -ls )। ব্যবহারের সুবিধা -exec ls {}হ'ল এটি ইতিমধ্যে অনুসন্ধানের জন্য বাহ্যিক কিছু কার্যকর করে । সুতরাং সময় আপনার কাছ থেকে সুইচ দ্বারা lsকরা mv, প্রকৃত পরিবর্তনটি ন্যূনতম।
একটি সিভিএন

3

ম্যান পেজ অনুসারে, -মাইটাইমে যুক্তিটি হ'ল আপনি যে দিনগুলি অনুসন্ধান করছেন। আপনি date +%jচলতি বছরের ১ লা জানুয়ারি থেকে দিনের সংখ্যাটি সন্ধান করতে ব্যবহার করতে পারেন ।


2
চমৎকার উপায়. খুব "nitpicky" হতে: -মটাইম -1: গত 24 ঘন্টা সময় যে কোনও ফাইল। গতকাল (বা আজ) কেবলমাত্র ফাইলগুলি নয়। সুতরাং, একটি সামান্য "ওভারল্যাপ" থাকবে: আপনি যদি 2012 সাল থেকে 120 দিন হয়ে গেছে তা নির্ধারণ করেন এবং আজ যখন আপনি স্ক্রিপ্টটি চালু করেন তখন 15:45 হয়, আপনি 31 ডিসেম্বর 15:45 পর্যন্ত ফাইলগুলি নির্বাচন করবেন up এবং সেদিনের শেষগুলি নয়) ... আপনি সম্ভবত ব্যবহার করতে পারেন: এনবি_ডে - 1, এবং তারপরে 2013 থেকে যে কয়েকজন তারিখ রয়েছে তাদের "আগাছা" করতে পারেন (এগুলি এলএস-এল | গ্রেপ-ভি, বিট দ্বারা পাওয়া যেতে পারে) যদি 1 দিনের পুরানো হয় তবে আউটপুট পৃথক হয় ... প্রচুর ক্ষতি ...)
অলিভিয়ার ডুলাক

আপনি -daystartযদি কাজ করতে যাচ্ছেন তবে আপনি বিকল্পটি ব্যবহার করতে চান না -mtime। অন্যথায় আপনি মধ্যরাতে একেবারে চালানো না হলে বছরের শুরু এবং শেষের দিকে ফাইলগুলির সাথে সমস্যা হবে। আপনি যদি নতুন বছর থেকে খুব সহজেই মিনিটের সংখ্যা খুঁজে পান তবে আপনি সেই -mminতুলনায় অফসেটটি আরও নির্ভুলভাবে করতে পারেন do -mtimeতবে একই সমস্যাটি -mtimeকেবল অল্প সংখ্যক ফাইলের জন্য (মধ্যরাতের নতুন দিকে যারা এই এক মিনিটের জন্য) উপস্থিত রয়েছে।
অ্যান্টন

1
হ্যাঁ, আমি পৃষ্ঠাটি পুনরায় পড়ছি আমি দেখছি এটি কীভাবে কয়েক ঘন্টার মধ্যে এটি ভেঙে যায় তাই সাধারণ কাজটি find -mtime $("date -+%j")সম্ভবত তারা যা যাচ্ছেন তা ওপি দেয় না। আমি এটি উত্তরোত্তর জন্য ছেড়ে দিচ্ছি যদিও যেহেতু এটি মানুষের মধ্যে পড়ার সম্ভাব্য অন্ধস্পট বলে মনে হচ্ছে।
ব্র্যাচলে

2

আপনি নিম্নলিখিত ওয়ান-লাইনারের মতো statএবং / অথবা dateকমান্ডের সাথে একটি সমন্বয় ব্যবহার করার চেষ্টা করতে পারেন :

বিএসডি / ম্যাক ওএস এক্স:

find . -type f -print | while read file; do eval `stat -s "$file"`; year=`date -jf "%s" "+%Y" "$st_mtime"`; dest="/path/to/destination/$year; mkdir -p "$dest"; mv "$file" "$dest"; done

লিনাক্স:

find . -type f -print | while read file; do year=`date -r "$file" "+%Y"`; dest="/path/to/destination/$year; mkdir -p "$dest"; mv "$file" "$dest"; done

উভয় ক্ষেত্রেই পদ্ধতির হ'ল dateপ্রতিটি ফাইলের শেষ পরিবর্তনের সময় থেকে বছরটি বের করতে এবং তারপরে এই বছরটির সাথে একটি পথ তৈরির নির্দেশটি ব্যবহার করা । কমান্ডটি mkdir -pএই পথটি তৈরি করে যদি এটি ইতিমধ্যে বিদ্যমান না থাকে। অবশ্যই আপনি findআপনার অনুসন্ধানটি পরিমার্জন করতে কিছু অন্যান্য বিকল্প ব্যবহার করতে পারেন ।


1

আপনি যদি ওয়ার্কিং ডিরেক্টরি থেকে এটি করেন তবে আপনি এটি পরিবর্তে এটি করতে পারেন:

ls -l |awk '{ if ($8 == "2013") print $9 }'

এটি জিনিসগুলিকে যথেষ্ট সরল করে তোলে এবং কোনও ওভারল্যাপের কারণ হয় না। তবে এটি ধরেও নিয়েছে যে এই ফাইলগুলি 6 মাসেরও বেশি পুরানো এবং lsএটি সঠিক সময়ের পরিবর্তে বছরের মুদ্রণ করবে।

6 মাসেরও পুরানো ফাইলগুলির জন্য, আপনাকে কেবল এটির সাথে এটি প্রতিস্থাপন করতে হবে:

ls -l |awk '{ if ($6 == "May") print $9 }' 

বা মাসের উপর নির্ভর করে অনুরূপ কিছু। আপনি যদি ফাইলগুলি সরানোর জন্য মাসের একটি তালিকা তৈরি করতে চান (বা বছরের পর বছর ধরে একটি তালিকা তৈরি করতে চান) এটি করুন:

month="May Jun Jul"; 
for i in `echo $month`; 
do 
    for j in `ls -l |awk '{ if ($6 == "'$i'") print $9}'`
    do
        mkdir -p $i
        mv $j $i
    done
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.