Смотрю на эти сложности и радует что народ пробует все средства для достижения цели. Задача понятна, но решение не универсальное. А что, если надо скопировать данные только за 14-16 Января 2009? Используйте: 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 f -exec cp <> TARGET \;
Если надо создать структуру каталогов: 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/<> \;
Какойй перл?? проще ман по find почтать а не плодить велосипеды У вас много скриптов на пер/питоне/подставить_нужное на сервере крутится? или просто лениво для примитивных задачек освоить команду man ? P.S больше велосипедов,красивых и разных
1. Несколько лет назад BSDшный date не умел показывать произвольные даты, сейчас не знаю. Такая штука канала только для GNU.
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/
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; .
Источник
Команда mv
Описание команды mv
Команда mv используется для перемещения одного или нескольких файлов (или директорий) в другую директорию, а также для переименования файлов и директорий.
Синтаксис
исходные_файлы — это то, что мы будем перемещать или переименовывать. То есть это либо один файл, либо несколько файлов, либо директория, либо несколько директорий.
куда — это название директории, в которую мы перемещаем исходные файлы или директории. Или же это новое название файла или директории, если выполняется переименование. То есть это либо директория, либо новое название файла или директории.
Команда mv может:
Переместить один или несколько файлов в другую директорию.
Переместить одну или несколько директорий в другую директорию.
Переименовать файл.
Переименовать директорию.
Опции
none или off — не делать резервных копий, даже если включена опция —backup
numbered или t — имя резервной копии получит числовой индекс (пример: myfile.txt
).
existing или nil — если в директории уже есть резервные копии с числовыми индексами, то использовать числовые индексы для новых резервных копий, во всех остальных случаях использовать метод simple .
simple или never — делать обычные резервные копии (пример: myfile.txt
Примеры использования команды mv
Рассмотрим несколько примеров использования команды mv в Linux.
Рекомендуется всегда использовать опцию -v , чтобы получать информацию о том, что именно команда mv делает с файлами.
Также крайне рекомендуется использовать опцию -i , чтобы выдавался запрос на перезапись существующих файлов. В примерах ниже мы эти опции опускаем.
Переместить файл
Переместим файл myfile1.txt в директорию mydir/ (директория должна существовать). Для этого выполняем команду без каких-либо аргументов:
Переименовать файл
Переименуем файл myfile1.txt в myfile2.txt :
Переименовать директорию
Переименуем директорию mydir1 в mydir2 . Выполняется точно также, как и переименование файлов.
Создавать резервные копии существующих файлов
Предположим, что нам нужно переименовать файл myfile1.txt в myfile2.txt , но файл myfile2.txt уже существует. Можно воспользоваться опцией -b , чтобы создать резервную копию существующего файла:
В результате сначала существующий файл myfile2.txt будет переименован в myfile2.txt
, то есть будет создана его резервная копия, и только потом файл myfile1.txt будет переименован в myfile2.txt .
Вместо значка тильда
можно добавлять к именам резервных копий произвольный суффикс. Например, добавим суффикс .bak . Для этого воспользуемся опцией -S
Переместить несколько файлов
Рассмотрим примеры использования команды mv для перемещения нескольких файлов в другую директорию.
Переместим сразу три файла в директорию mydir/
Переместим все файлы из текущей директории в директорию mydir/
Переместим все файлы с расширением .jpg в директорию mydir/
Переместить только те файлы, которых нет в директории назначения
Предположим, что нам нужно переместить все файлы из одной директории в другую, но если в директории назначения уже есть файлы с такими же именами, то их не перемещать. Для этого используем опцию -n
Переместить только те файлы, которые новее
Предположим, что нам нужно переместить все файлы из одной директории в другую, но если в другой директории уже есть файлы с такими же именами, то заменять существующие файлы только если исходный файл новее (по дате). Для этого используем опцию -u
Если в имени файла есть пробелы
Если в имени файла есть пробелы, то имя файла нужно заключить в кавычки или перед каждым пробелом добавлять символ \
Предположим, что нам нужно переименовать файл в имени которого содержится пробел — My file1.txt . Для этого можно заключить имя файла в кавычки (для файла назначения аналогично).
Или использовать символ косой черты перед пробелом.
Источник
Перемещение файлов по дате в другую папку с использованием CLI
У меня есть большое количество фотографий со старого жесткого диска, который я пытаюсь организовать. Если я запустил ls -l , я заметил, что все эти файлы имеют дату создания в 2012 году или раньше. В идеале я хотел бы переместить их на второй жесткий диск моего компьютера, который не настроен автоматически на установку. Предпочтительно, я мог бы сделать это все как пакет с некоторыми командами, связанными друг с другом. До сих пор у меня есть ls -l | grep -i 2012 ls -l | grep -i 2012 который выплескивает только файлы с 2012 годом в дате, предоставленной ls -l . Теперь трюк будет состоять из всех этих файлов в новый каталог. Я не уверен, куда идти дальше, потому что каждый файл должен быть скопирован. Каким будет мой следующий набор команд?
Не используйте ls . Не рекомендуется использовать в таких случаях. Более того, использование grep для фильтрации по дате не является хорошей идеей. Имя файла может содержать строку 2012 , хотя в 2012 году она не была изменена.
Используйте команду find и выведите ее вывод.
Если у вас есть более старые файлы на старом диске, которые вы хотите игнорировать, я бы сделал это как это
Создайте временный файл маркера с измененной датой, которая отделяет файлы, которые я хочу от тех, которые я не делаю
Скопировать файлы старше файла маркера в новое место
Вот примеры команд для этого, которые предполагают, что вы хотите поддерживать любую иерархию каталогов со старого диска в новом ( cpio – это команда копирования, аналогичная tar или pax ):
Я думаю, может быть, эта проблема очень похожа на вашу, вы также можете это проверить: Создайте подкаталоги и упорядочивайте файлы по дате
Я пишу этот новый скрипт на основе первого ответа этой проблемы:
напишите этот скрипт в файл с именем copy.sh в своем старом каталоге.
замените /your/new/directory на путь вашего нового каталога
сделать этот файл исполняемым с помощью chmod +x copy.sh
затем выполните этот файл ./copy.sh
Вероятно, вы должны использовать пакетный инструмент для пакетных операций. Это обычно связано с чтением / записью всех записей в одном потоке, а не, например, вызовом отдельного процесса cp для каждого скопированного файла.
Здесь уже написан cpio ответ, который, учитывая только уже предоставленные варианты, скорее всего, я бы выбрал. Однако формат cpio был улучшен и сфальсифицирован в стандартизированный формат архива pax с момента его расцвета. То же самое можно сказать и о tar .
Строго POSIX- pax вряд ли предоставит какие-либо опции для непосредственной фильтрации членов архива на основе времени модификации файла – хотя стандарт задает модификатор формата списка %T list-mode. Тем не менее, наиболее распространенная реализация pax о которой я знаю, – это версия BSD, поддерживаемая mirabilos , расширяет ее до прямого доступа к CLI-коммутатору.
Например, чтобы скопировать только все файлы в дерево, внедренное в ./ которое было в последний раз изменено до ccyymmddHHMM to /target/dir вы могли бы сделать:
Чтобы избежать рекурсии в дочерние каталоги, вы можете:
Дополнительную информацию см. На странице руководства.
Источник
forum.lissyara.su
Перегреется танк, заведу звездолёт.
выборка файлов по дате создания
выборка файлов по дате создания
Непрочитанное сообщение dump » 2011-02-02 17:06:41
14000 файлов , с добавлением каждый день . Появилось желание написать скрипт , который делал бы следующее — искал файлы в этой директории по месяцу( по какой то дате ) создания и перемещал их созданную папку с именем месяца . Вроде всё просто ! а чем найти ? find с таким количеством файлов отказывается работать , чем можно выбрать ? ОС Freebsd
Услуги хостинговой компании Host-Food.ru
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Непрочитанное сообщение dump » 2011-02-02 17:24:06
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Непрочитанное сообщение dump » 2011-02-02 17:40:59
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Непрочитанное сообщение dump » 2011-02-02 18:00:16
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Непрочитанное сообщение dump » 2011-02-02 18:22:11
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Непрочитанное сообщение dump » 2011-02-02 18:37:04
это копи паст 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: выборка файлов по дате создания
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
по поводу * в ком. строке:
то программа command получит первым параметром /usr/ports/*
Re: выборка файлов по дате создания
Непрочитанное сообщение dump » 2011-02-04 14:15:00
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Re: выборка файлов по дате создания
Непрочитанное сообщение dump » 2011-02-04 15:38:45
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 .