Страница 1 из 1

выборка файлов по дате создания

Добавлено: 2011-02-02 17:06:41
dump
Имеется директория в которой ~14000 файлов , с добавлением каждый день . Появилось желание написать скрипт , который делал бы следующее --
искал файлы в этой директории по месяцу( по какой то дате ) создания и перемещал их созданную папку с именем месяца . Вроде всё просто !
а чем найти ?
find с таким количеством файлов отказывается работать , чем можно выбрать ?
ОС Freebsd

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 17:13:41
kpp
В смысле find отказывается?
Чем аргументирует? :smile:

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 17:24:06
dump
find /data/* -ctime +200 -ls
find: Argument list too long

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 17:32:49
kpp
А если вывод в файл перенаправить?
И звезда вроде не обязательна.

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 17:40:59
dump
а что даст вывод в файл ?
нужно найти файлы определённого месяца после черо их переместить в другую папку . ман find тоже не сказал как выбрать по дате , с именами можно .
обычный листинг ls -l /data |grep Nov . насколько я понимаю грепом просто делаю выборку а как нужное направить куда надо

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 17:51:00
kpp
А если так:

Код: Выделить всё

find /data/ -ctime +200 -exec echo {} >> testfile \;
Имя каждого файла, попадающего под условие записывается в файл testfile - это для теста
ну а для переноса:

Код: Выделить всё

find /data/ -ctime +200 -exec mv {} каталог_назначения \;

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 17:53:39
dmtr
find с таким количеством файлов отказывается работать
шо-то сдаетя мне дело не в количестве. у меня

Код: Выделить всё

find /* -ctime +200 -ls
попер выводить файло, не ругается.

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 18:00:16
dump
-ctime +200 -exec cp {} /data/ \;
/sbin/find: Argument list too long.

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 18:09:57
kpp

Код: Выделить всё

find /data/ -type f -ctime +200 -exec cp {} "каталог_назначения" \;
В кавычки двойные каталог_назначения и -type f не помешает.

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 18:22:11
dump
аналогично . ни чего не помогает

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 18:27:50
dmtr
што-то мне не нравится
то
find: Argument list too long
то
/sbin/find: Argument list too long.
покажите

Код: Выделить всё

# uname -r
# which find

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 18:37:04
dump
это копи паст find: Argument list too long полный с /sbin/find: Argument list too long
which find
/usr/bin/find
7.2-RELEASE-p8

боевая машина . в других директориях где нормальное количество файлов всё работает с разными ключами .
была история тоже с find: Argument list too long при удалении find . -ctime +30 -exec rm решалась с помощью find . -ctime +30 |xargs rm . но в данном случае и xargs не помогает .

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 18:51:33
dmtr
я возможно не туда копаю, но
если

Код: Выделить всё

which find
/usr/bin/find
откуда
полный с /sbin/find: Argument list too long
почему /sbin/find?

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 20:16:13
rmn

Код: Выделить всё

remcomp% ls -l -D "%F" /usr/local/etc | head
total 574
drwxr-xr-x  3 root   wheel     512 2011-01-31 CORBA
drwxr-xr-x  5 root   wheel     512 2011-01-31 ConsoleKit
-r--r--r--  1 root   wheel     588 2010-06-07 GeoIP.conf.default
drwxr-xr-x  2 root   wheel     512 2011-01-31 PolicyKit
drwxr-xr-x  5 root   wheel     512 2011-01-31 X11
drwxr-xr-x  5 root   wheel     512 2011-02-01 apache22
-r--r--r--  1 root   wheel     164 2010-06-07 aspell.ver
drwxr-xr-x  3 root   wheel     512 2011-01-31 avahi
drwxr-xr-x  2 root   wheel     512 2011-01-31 bash_completion.d

remcomp% cat sort_by_date.sh 
#!/bin/sh

src_dir=$1
dst_dir=$2

ls -l -D "%F" ${src_dir} | grep -v ^total | awk '{print $6,$7}' |
(
        while read d n
        do
                mkdir -p ${dst_dir}/${d}
                cp -R ${src_dir}/${n} ${dst_dir}/${d}/
        done
)

remcomp% sudo ./sort_by_date.sh /usr/local/etc /tmp/sorted

remcomp% ll /tmp/sorted/
total 14
drwxr-xr-x   3 root  wheel   512  2 фев 19:14 2009-09-11
drwxr-xr-x   2 root  wheel   512  2 фев 19:14 2009-12-28
drwxr-xr-x   2 root  wheel   512  2 фев 19:14 2010-06-07
drwxr-xr-x   2 root  wheel   512  2 фев 19:14 2010-06-30
drwxr-xr-x   4 root  wheel   512  2 фев 19:14 2011-01-30
drwxr-xr-x  27 root  wheel  1024  2 фев 19:14 2011-01-31
drwxr-xr-x   7 root  wheel   512  2 фев 19:14 2011-02-01

Re: выборка файлов по дате создания

Добавлено: 2011-02-02 20:33:46
rmn
по поводу * в ком. строке:

если указываем:

Код: Выделить всё

%command "/usr/ports/*"
то программа command получит первым параметром /usr/ports/*

если указываем:

Код: Выделить всё

%command /usr/ports/*
то шелл перед вызовом command заменит параметр на список файлов. т.е. command будет вызвана так:

Код: Выделить всё

%command /usr/ports/CHANGES /usr/ports/GIDs /usr/ports/INDEX-6 ...
отсюда и Argument list too long, т.к. find, в твоем случае, получит ~14000 параметров.

Re: выборка файлов по дате создания

Добавлено: 2011-02-04 14:15:00
dump
Огромное Спасибо за помощь , скрипт не много модифицировал работает как надо

Re: выборка файлов по дате создания

Добавлено: 2011-02-04 14:24:07
kpp
Так а в чем причина была?
С find так и не удалось ?

Re: выборка файлов по дате создания

Добавлено: 2011-02-04 15:21:30
kpp
rmn писал(а):

Код: Выделить всё

remcomp% ls -l -D "%F" /usr/local/etc | head
Что за опция у ls -D "%F" перерыл ман - ничего не нашел во FreeBSD ?
Под линукс - есть такая опция.

Re: выборка файлов по дате создания

Добавлено: 2011-02-04 15:35:38
rmn

Код: Выделить всё

     -D format
             When printing in the long (-l) format, use format to format the
             date and time output.  The argument format is a string used by
             strftime(3).  Depending on the choice of format string, this may
             result in a different number of columns in the output.  This
             option overrides the -T option.

Код: Выделить всё

remcomp% uname -a
FreeBSD remcomp 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jan 31 12:43:32 EET 2011     root@:/usr/obj/usr/src/sys/REMCOMP  i386

Re: выборка файлов по дате создания

Добавлено: 2011-02-04 15:38:45
dump
find не работает ( как писалось выше ) если число файлов ( аргументов ) превышает 3094

ls | wc -l
3100
find * -mtime +10 -print
/sbin/find: Argument list too long.
Не работате , Предел

ls | wc -l
3093
find * -mtime +10 -print
1289227257.M89348P79332V00000058I004730AC_102
1289227257.M897212P79332V00000058I004730E3_157
1289227257.M936218P79332V00000058I004730E4_158
1289227257.M948282P79332V00000058I004730E5_159
1289227257.M968154P79332V00000058I004730E6_160
1289227258.M47627P79332V00000058I004730E7_161
1289227258.M95261P79332V00000058I004730E8_162
1289227277.M849968P79333V00000058I00472AB8_0
Всё Ок

Потом стал выбирать ls ом , но не знал как перенаправить дальше . Ещё раз СПС за скрипт .
P.S Предел для find 3093 .

На FreeBsd
ls -l ${src_dir} | grep ${Month} | awk '{print($6,$9)}' |
(
while read d n
do
mv ${src_dir}/${n} ${dst_dir}/
done

)

Re: выборка файлов по дате создания

Добавлено: 2011-02-04 15:47:40
kpp
2 rmn
Ясно:
# uname -a

Код: Выделить всё

FreeBSD 7.3-RELEASE-p4
Такой опции нет, а ведь полезная :pardon:

2 dump
Есть ограничение, но оно должне решаться через xargs.
Вот только нужно подумать что меньше\оптимальнее будет - интересно, потестирую.

Re: выборка файлов по дате создания

Добавлено: 2011-02-04 16:28:50
rmn
kpp писал(а):2 rmn
Ясно:
# uname -a

Код: Выделить всё

FreeBSD 7.3-RELEASE-p4
Такой опции нет, а ведь полезная :pardon:

Код: Выделить всё

remcomp% stat -t "%F" -f "%Sm %N" /usr/local/etc/* | head
2011-01-31 /usr/local/etc/CORBA
2011-01-31 /usr/local/etc/ConsoleKit
2010-06-07 /usr/local/etc/GeoIP.conf.default
2011-01-31 /usr/local/etc/PolicyKit
2011-01-31 /usr/local/etc/X11
2011-02-01 /usr/local/etc/apache22
2010-06-07 /usr/local/etc/aspell.ver
2011-01-31 /usr/local/etc/avahi
2011-01-31 /usr/local/etc/bash_completion.d
2011-01-31 /usr/local/etc/dbus-1
как вариант

Re: выборка файлов по дате создания

Добавлено: 2011-02-06 1:25:21
kpp
Из выражения:

Код: Выделить всё

find /data/* -ctime +200 -ls
нужно обязательно убрать *

Если файлов очень много (ошибка Argument list too long) , делать через xargs

Код: Выделить всё

find /data/ -ctime +200 -print0 | xargs -0 -I '{}' cp {} "каталог_назначения"
Долго не мог найти как "получить" каждый файл, для передачи его в команды, например cp или mv
Подсказку с примером нашел здесь:
http://www.mkssoftware.com/docs/man1/xargs.1.asp

Re: выборка файлов по дате создания

Добавлено: 2011-02-07 10:42:16
dump
очень полезная ссылка СПС , тоже долго искал что то вразумительное про xargs