Як я можу рекурсивно перелічити всі файли, які були змінені між 22.12.2011 та 24.12.2011?
Як я можу рекурсивно перелічити всі файли, які були змінені між 22.12.2011 та 24.12.2011?
Відповіді:
Взагалі кажучи, коли ви шукаєте файли в каталозі та його підкаталогах рекурсивно, використовуйте find
.
Найпростіший спосіб визначити діапазон дат find
- це створити файли на межах діапазону та використовувати -newer
предикат.
touch -t 201112220000 start
touch -t 201112240000 stop
find . -newer start \! -newer stop
-newer
?
-newer
не заперечується, другий -. "Знайдіть файли, які новіші, start
але не новіші stop
".
start
і stop
.
Використовуючи рішення Жилла і, прочитавши людину, знайдіть (1) знову, я знайшов більш просте рішення. Найкращий варіант - -newerXY. Прапори m та t можуть бути використані.
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 рядках).
-exec ... +
в find(1)
, як: find -newermt 20150212 \! -newermt 20150213 -exec grep keyword -m 50 -l {} +
. Це робить те саме, але дешевше.
find 4.7.0-git
).
Якщо припустити, що не потрібно точності до секунд, це має спрацювати.
find . -type f -mmin -$(((`date +%s`-`date -d 20111222 +"%s"`)/60)) \! -mmin +$(((`date +%s`-`date -d 20111224 +"%s"`)/60))
EDIT: Змінено cmin
до mmin
після @ коментар Eelvex в.
Редагувати: '\!' зниклий безвісти
-cmin
є "зміна статусу", -mmin
це "зміна даних". Ви, мабуть, хочете-mmin
Зауважте, що питання, позначене як дублікат, тому не може відповідати на нього безпосередньо, саме тому я публікую тут. Ця відповідь призначена для відповіді на питання "потрібно перемістити файли в іншу папку на основі дати створення [дубліката]"
Відповіді обґрунтовані, але були деякі обмеження із суто командою find. Я написав цей скрипт оболонки, щоб пройти каталог з такою кількістю файлів, у якій файлова система затягувала метадані, намагаючись виконати ls. Крім того, деякі * nix системи усунуть занадто багато помилок аргументів при запуску ls.
Команда find є дуже потужною, і я почав із перерахованих методів, але у мене було стільки років даних у цьому каталозі, що мені довелося повторно передавати всі файли. Це створює багато непотрібних переданих файлів у кожному файлі. Я намагався робити один екран на рік і запускати кілька знахідок, але це призводило до безлічі помилок від кожної знахідки, і файли пропали б, коли одна із знахідок перемістила його.
Мій скрипт оболонки переміщує файл у каталог призначення із чотиризначним роком та двозначним місяцем. Його можна легко розширити до двозначного дня, коментуючи пару рядків та коментуючи своїх колег. Я вважаю, що це більш ефективно, тому що виконувати рухи за один прохід пошуку, тому безліч команд пошуку та переходи через каталог не потрібні.
#!/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 для пошуку, оскільки все знахідка - це одноразове виконання кожного знайденого файлу, і сценарій приймає всі рішення.
Майте на увазі, що якщо не вибрати -типу f, він буде переміщувати каталоги навколо, і це, ймовірно, спричинить проблеми. Ви також можете використовувати -type d, якщо хочете переміщати лише каталоги. Якщо встановити тип, майже напевно призведе до небажаної поведінки.
Пам’ятайте, що цей сценарій був пристосований до мого потреби. Ви можете просто використати мою конструкцію як натхнення для кращого підходу під ваш сценарій потреб. Дякую!
Міркування: Ефективність команди може бути ВЕЛИЧЕЗНО покращена, дозволяючи через сценарій пропускати необмежену кількість аргументів. Це насправді порівняно просто, якщо ви переходите через змінну $ @. Розширення функціональності цього дозволяє, наприклад, використовувати функцію find -exec + або використовувати xargs, наприклад. Я можу швидко реалізувати це і вдосконалити власну відповідь, але це початок.
Оскільки це був сеанс однократного сценарію, можливо, вдосконалення можна зробити багато. Удачі!