उन फ़ाइलों को कैसे सूचीबद्ध किया जाए जो एक निश्चित समय में बदल गए थे?


38

मैं 22.12.2011 और 24.12.2011 के बीच परिवर्तित की गई सभी फ़ाइलों को कैसे पुन: सूचीबद्ध कर सकता हूँ?


6
अगर आपका मतलब 'आखिरी बदला हुआ' है, तो आपके पास एक समाधान है। यदि कोई फ़ाइल 26.12.2011 को संशोधित की गई थी, तो आप यह नहीं बता सकते कि क्या यह आपके दिए गए रेंज के दौरान भी संशोधित की गई थी। (जब तक आपके पास एक बहुत ही विदेशी फाइल सिस्टम न हो।)
विलियम पर्ससेल

जवाबों:


25

आम तौर पर बोलते समय, जब आप किसी निर्देशिका और इसके उपनिर्देशिका में फ़ाइलों की पुन: खोज कर रहे हों, तो उपयोग करें find

दिनांक सीमा को निर्दिष्ट करने का सबसे आसान तरीका सीमा findकी सीमाओं पर फ़ाइलें बनाना और -newerविधेय का उपयोग करना है।

touch -t 201112220000 start
touch -t 201112240000 stop
find . -newer start \! -newer stop

-newerयहाँ पहले के उत्पादन की उपेक्षा क्यों आवश्यक है?
अलेक्जेंडर सीस्का

@AlexanderCska पहला -newerनकारात्मक नहीं है, दूसरा है। "उन फ़ाइलों को खोजें जो नए हैं, startलेकिन नए की तुलना में नए हैं stop"।
गिल्स एसओ- बुराई को रोकना '15

ठीक है नकारात्मक आदेश के बाद काम करता है। यदि कोई भी नकारात्मकता मौजूद नहीं थी, तो क्या होगा?
अलेक्जेंडर सीस्का

@AlexanderCska तब आपको ऐसी फाइलें मिलेंगी जो नई हैं startऔर दोनों की तुलना में नई हैं stop
गाइल्स का SO- बुराई से दूर रहना '

35

गिल्स के समाधान का उपयोग करना और पढ़ने के बाद आदमी को ढूंढना (1) फिर से मुझे एक और सरल समाधान मिला। सबसे अच्छा विकल्प -newerXY है। एम और टी झंडे का इस्तेमाल किया जा सकता है।

m   The modification time of the file reference
t   reference is interpreted directly as a time

तो समाधान है

find . -type f -newermt 20111222 \! -newermt 20111225

समावेशी और ऊपरी बाउंड में निचली सीमा अनन्य है, इसलिए मैंने इसमें 1 दिन जोड़ा! और यह पुनरावर्ती है। यह v4.5.9 को खोजने पर अच्छा काम करता है।


शांत चाल, धन्यवाद! इससे मुझे एक हालिया फ़ाइल मिली, जिसमें हजारों फ़ाइलों वाली एक निर्देशिका में एक निश्चित कीवर्ड था: find -newermt 20150212 \! -newermt 20150213 | xargs grep 'keyword' -m 50 -l( -m 50= पहले 50 लाइनों में खोजें)।
रोब डब्ल्यू

@RobW: वास्तव में आप का उपयोग कर पाइप और xargs छोड़ सकते -exec ... +में find(1), जैसे: find -newermt 20150212 \! -newermt 20150213 -exec grep keyword -m 50 -l {} +। यह वही करता है, लेकिन सस्ता है।
ट्रू वाई

मुझे डबल उद्धरण के साथ टाइमस्टैम्प्स को घेरना था (मैं उबंटू ज़ेनियल के साथ हूं find 4.7.0-git)।
इसहाक

13

पहले से दिए गए उत्तरों के अलावा, ध्यान दें कि आप सीधे अपनी तिथियां निर्दिष्ट कर सकते हैं:

find -type f -newermt "2011-12-22" \! -newermt "2011-12-24"

या

find -type f -newermt "2011-12-22 00:00:00" \! -newermt "2011-12-24 13:23:00"

यदि आप इसके अतिरिक्त समय निर्दिष्ट करना चाहते हैं।


6

यह मानते हुए कि आपको सेकंड के लिए सटीकता की आवश्यकता नहीं है, यह काम करना चाहिए।

find . -type f -mmin -$(((`date +%s`-`date -d 20111222 +"%s"`)/60)) \! -mmin +$(((`date +%s`-`date -d 20111224 +"%s"`)/60))

EDIT: @ Eelvex की टिप्पणी के बाद बदला cminगया mminसंपादित करें: '\'! लापता


एचएम doesn't काम करने लगते हैं। क्या आप सुनिश्चित हैं कि यह पुनरावर्ती उपनिर्देशिका के माध्यम से चलता है?
क्लैम्प

हां, यह मुझ पर काम करता है। क्या आपके पास वास्तव में उस समय सीमा में संशोधित फाइलें हैं? इसे अलग-अलग समय सीमाओं के साथ आज़माएं।
onur güngör

6
-cmin"स्थिति परिवर्तन" है, -mmin"डेटा परिवर्तन" है। आप शायद चाहते हैं-mmin
आठ

3

findउदाहरण के लिए UTC पर एक सर्वर के लिए एक ISO स्वरूपित डेटाटाइम ले सकता है, तो आप जहाँ भी हैं, वहाँ से कई घंटों की ऑफ़सेट निर्दिष्ट कर सकते हैं। यह इस बात का भी ध्यान रखता है कि आप एक दिन जोड़ रहे हैं क्योंकि आप समय की तुलना कर रहे हैं:

find -type f -newermt 20111224T0800 \! -newermt 20111225T0800

0

कृपया ध्यान दें कि प्रश्न को डुप्लिकेट के रूप में चिह्नित किया गया है, और इसलिए इसे सीधे उत्तर देने से प्रतिबंधित है, यही कारण है कि मैं यहां पोस्ट कर रहा हूं। यह उत्तर इस प्रश्न का उत्तर देने के लिए है "सृजन तिथि [डुप्लिकेट] के आधार पर विभिन्न फ़ोल्डर में फ़ाइलों को स्थानांतरित करने की आवश्यकता है"

उत्तर वाजिब हैं लेकिन विशुद्ध रूप से खोजने की आज्ञा के साथ कुछ सीमाएँ थीं। मैंने इस शेल स्क्रिप्ट को एक डायरेक्टरी से गुजरने के लिए लिखा है जिसमें कई फाइलें हैं, जो फाइल सिस्टम मेटाडाटा पर गैगिंग कर रहा है। इसके अतिरिक्त कुछ * निक्स सिस्टम चल रहे ls के साथ बहुत अधिक तर्क त्रुटि को रोक देगा।

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

मेरी शेल स्क्रिप्ट गंतव्य निर्देशिका में एक फ़ाइल ले जाती है, जिसमें 4 अंकों का वर्ष और 2 अंकों का महीना होता है। यह आसानी से एक दो लाइनों को जोड़कर और अपने समकक्षों की टिप्पणी करके 2 अंकों के दिन तक विस्तारित किया जा सकता है। मेरा मानना ​​है कि यह अधिक कुशल है क्योंकि यह एक से अधिक पास में चालें प्रदर्शन कर रहा था ताकि कई कमांड मिलें और निर्देशिका से गुजरने वाले अनावश्यक हैं।

#!/bin/bash
#We want to exit if there is no argument submitted
if [ -z "$1" ]
then
  echo no input file
  exit
fi

#destDir should be set to where ever you want the files to go
destDir="/home/user/destination"

#Get the month and year of modification time
#--format %y returns the modification date in the format:
# 2016-04-26 12:40:48.000000000 -0400
#We then take the first column, split by a white space with awk
date=`stat "$1" --format %y | awk '{ print $1 }'`

#This sets the year variable to the first column split on a - with awk
year=`echo $date | awk -F\- '{print $1 }'`
#This sets the month variable to the second column split on a - with awk
month=`echo $date | awk -F\- '{print $2 }'`
#This sets the day variable to the third column split on a - with awk
#This is commented out because I didn't want to add day to mine
#day=`echo $date | awk -F\- '{print $3 }'`

#Here we check if the destination directory with year and month exist
#If not then we want to create it with -p so the parent is created if
# it doesn't already exist
if [ ! -d $destDir/$year/$month ]
then
  mkdir -p $destDir/$year/$month || exit
fi

#This is the same as above but utilizes the day subdirectory
#Uncommented this out and comment out the similar code above
#if [ ! -d $destDir/$year/$month/$day ]
#then
#  mkdir -p $destDir/$year/$month$day || exit
#fi

#Echoing out what we're doing
#The uncommented is for just year/month and the commented line includes day
#Comment the first and uncomment the second if you need day
echo Moving $1 to $destDir/$year/$month
#echo Moving $1 to $destDir/$year/$month/$day

#Move the file to the newly created directory
#The uncommented is for just year/month and the commented line includes day
#Comment the first and uncomment the second if you need day
mv "$1" $destDir/$year/$month
#mv "$1" $destDir/$year/$month/$day

एक बार सहेजने और निष्पादन योग्य बनाने के बाद आप इस स्क्रिप्ट को निम्नलिखित की तरह खोज सकते हैं।

find /path/to/directory -type f -exec /home/username/move_files.sh {} \;

आपको खोजने के लिए newermt विकल्प को सेट करने के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि सभी खोज प्रदान कर रहा है प्रति फ़ाइल एक एकल निष्पादन पाया जाता है और स्क्रिप्ट सभी निर्णय लेता है।

ध्यान रखें कि यदि आप -type f का चयन नहीं करते हैं, तो यह निर्देशिकाओं को चारों ओर ले जाएगा और इससे समस्याएँ उत्पन्न होंगी। यदि आप केवल निर्देशिकाओं को स्थानांतरित करना चाहते हैं तो आप -type d का भी उपयोग कर सकते हैं। प्रकार की स्थापना नहीं करना निश्चित रूप से अवांछित व्यवहार का उत्पादन करेगा।

याद रखें कि यह लिपि मेरी आवश्यकताओं के अनुरूप थी। आप अपनी जरूरतों की स्क्रिप्ट के लिए बेहतर अनुकूलता के लिए प्रेरणा के रूप में मेरे निर्माण का उपयोग करना चाहते हैं। धन्यवाद!

बातें: आदेश की दक्षता में किया जा सकता है की बहुत स्क्रिप्ट के माध्यम से पारित करने के लिए तर्क की एक असीमित संख्या की अनुमति देकर सुधार हुआ। यदि आप $ @ चर पर से गुजरते हैं तो यह वास्तव में अपेक्षाकृत आसान है। इस की कार्यक्षमता का विस्तार करने से हम उदाहरण के लिए -exec + फ़ंक्शन या लीवरेज xargs का उपयोग कर सकेंगे। मैं जल्दी से इसे लागू कर सकता हूं और अपने स्वयं के उत्तर में सुधार कर सकता हूं लेकिन यह एक शुरुआत है।

चूंकि यह एक-शॉट स्क्रिप्ट सत्र था, इसलिए संभवतः कई सुधार हैं जो किए जा सकते हैं। सौभाग्य!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.