Столкнулся с такой задачей: из каталога необходимо выбрать и скопировать кучу файлов за один месяц. Вооружившись командами cp, ls и awk я приступил и вот что получилось: cp $(ls -l | grep 2009-01 | awk '{print $8}') /home/temp/ ls -l выводит содержимое каталога с датой grep соответственно выбирает файлы за месяц awk '{print $8}' выводит имя файла для команды cp Дальше больше ... Есть каталог в котором куча подкаталогов и в которых соответственно файлы, которые надо скопировать. Тут на помощь приходит утилита du: cp $(du -a --time | grep 2009-01 | awk '{print $4}') /home/temp/
Пардон, отсортировать по дате, выделить и скопировать.Что он там не умеет?Если надо 1 раз - вполне вариант.Правда если это надо регулярно, сие превращается в вариант для неленивых мартышек.А ленивые городят вот такие конструкции :)
Вот в Archlinux (локаль ru_RU.utf8):
ls -l | awk '/Янв/{print $9}'
Если надо создать структуру каталогов: find -mtime +$(expr $(expr $(date +%s) - $(date -d "Jan 14 2009" +%s)) / 3600 / 24) -mtime -$(expr $(expr $(date +%s) - $(date -d "Jan 16 2009" +%s)) / 3600 / 24) -type d -exec mkdir TARGET/{} \;
Читайте маны.
2. Сравните скорость для большого, но обозримого количества файлов: $ for N in 'seq 1 1 100000' ; do echo "zzz" > ./$N.testfile ; done $ time find ./ -type f -mtime -1 -exec cp {} ../bbbbbb \;
real 4m23.219s user 0m21.110s sys 3m47.518s $ time cp $(ls -1) $ mkdir ../cccccc $ time cp $(ls -1) ../cccccc/
real 0m5.298s user 0m0.906s sys 0m3.995s $
Но с мыслью я согласен, надо использовать find. $ time cp $(find ./ -type f -mtime -1) ../dddddd/
real 0m5.502s user 0m0.747s sys 0m4.310s $
А я бы сделал так: for a in 'find . ...' do [ -d $a ] && mkdir /home/temp/$a [ -f $a ] && cp $a /home/temp/$a done
Хотя это кому как больше нравится/умеется/привычнее)
Кстати не указано, файлы созданы за последний месяц, или измененные за последний месяц, или к ним был доступ за последний месяц.
Хотя судя по тому, что используется ls -l, идет речь об изменении.
bash: /bin/cp: Слишком длинный список аргументов
Для реально большой кучи не канает.
Значит нужен for - он и 1000000 элементов может обработать)
cp обламывается, потому что столько много аргументов не лезет в буфер командной строки шелла. for - [почти] точно такая же команда шелла с точно таким же буфером. Соответственно, for тоже обломается.
Расово верное решение здесь - передавать стопицот аргументов не через буфер, а через стандартный поток ввода-вывода. В него и двестипицот аргументов влезет:
ls -l ... | awk {...} | while read f; do something $f; done
Интересно, что
ls -tr /DIR1/DIR2/DIR3/* | while read f; ... - все-таки обломалось.
А вот
cd /DIR1/DIR2/DIR3/; ls -tr * | while read f; ...
на ура отработало.