The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

Выборка и копирование файлов по дате в Linux
Столкнулся с такой задачей: из каталога необходимо выбрать и скопировать кучу
файлов за один месяц.
Вооружившись командами 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/
 
30.04.2009 , Автор: Sclif13
Ключи: file, copy, bash, shell / Лицензия: CC-BY
Раздел:    Корень / Пользователю / Файлы, копирование, архивация

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, Manefesto (?), 12:11, 30/04/2009 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    а что find освоить не судьба ?
     
     
  • 2.2, prapor (??), 12:29, 30/04/2009 [^] [ответить]    [к модератору]
  • +/
    Ну, там еще один момент есть, пайпу из грепа в авк можно убрать, оставив все авку:
    ls | awk '/2009-01/ {print $8}'
     
  • 1.3, sn (??), 13:52, 30/04/2009 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    du: unrecognized option '--time'
    Попробуйте 'du --help' для получения более подробного описания.
     
  • 1.4, Nemo (??), 14:00, 30/04/2009 [ответить] [показать ветку] [···]    [к модератору]
  • +/
    Зачем так изварщаться? Когда есть команда find !
     
     
  • 2.5, Vardan (?), 15:01, 30/04/2009 [^] [ответить]    [к модератору]
  • +/
    Chelowek ze napisal
    Выборка и копирование файлов по дате............
     
     
  • 3.9, Alexander (??), 15:51, 30/04/2009 [^] [ответить]    [к модератору]  
  • +/
    у find есть еще и -exec
     
  • 1.6, Pervert (?), 15:24, 30/04/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    midnight commander
     
     
  • 2.7, angel_il (?), 15:37, 30/04/2009 [^] [ответить]    [к модератору]  
  • +/
    mc этого пока не умеет.
     
     
  • 3.16, User294 (ok), 18:29, 01/05/2009 [^] [ответить]    [к модератору]  
  • +/
    >mc этого пока не умеет.

    Пардон, отсортировать по дате, выделить и скопировать.Что он там не умеет?Если надо 1 раз - вполне вариант.Правда если это надо регулярно, сие превращается в вариант для неленивых мартышек.А ленивые городят вот такие конструкции :)

     
     
  • 4.24, pro100master (ok), 17:37, 06/05/2009 [^] [ответить]    [к модератору]  
  • +/
    вложенные папки и файлы не умеет. Да и если, судя по /tmp там 200к файлов и больше, клавишу отдавите :)))
     
  • 1.8, Alexander (??), 15:49, 30/04/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Что за ОС у топикстартера? BSD?

    Вот в Archlinux (локаль ru_RU.utf8):

    ls -l | awk '/Янв/{print $9}'

     
     
  • 2.13, Dan (??), 19:57, 30/04/2009 [^] [ответить]    [к модератору]  
  • +/
    а при чем тут BSD?
     
     
  • 3.21, Просто Лось. (?), 05:01, 03/05/2009 [^] [ответить]    [к модератору]  
  • +/
    При формате вывода ls.
     
  • 1.10, sys (??), 17:01, 30/04/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    А если в имени файл будет такая дата?
    Используйте find - это логичнее.
     
  • 1.11, bogus (??), 18:01, 30/04/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    гы гы гы, улыбнуло, больше нечего сказать.
     
  • 1.12, Аноним (-), 18:16, 30/04/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Мда, find освоить не судьба... Чайники пишут mini-HOWTO на opennet?
    Файлы с пробелами в именах обработаны не будут.
    Пользуйтесь
    find . -type f -mtime -30 -print0 | xargs -0 cp -t targetdir/
     
  • 1.14, Sergii Golovatiuk (?), 03:07, 01/05/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Смотрю на эти сложности и радует что народ пробует все средства для достижения цели. Задача понятна, но решение не универсальное. А что, если надо скопировать данные только за 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/{} \;

    Читайте маны.

     
     
  • 2.15, Crazy Alex (?), 15:28, 01/05/2009 [^] [ответить]    [к модератору]  
  • +/
    Чем ваять такое, проще скрипт в три строки на перле каком написать.
     
     
  • 3.17, Проходил мимо (?), 18:44, 01/05/2009 [^] [ответить]    [к модератору]  
  • +/
    Какойй перл?? проще ман по find почтать а не плодить велосипеды
    У вас много скриптов на пер/питоне/подставить_нужное на сервере крутится? или просто лениво для примитивных задачек освоить команду man ?
    P.S больше велосипедов,красивых и разных
     
  • 2.20, Просто Лось. (?), 04:59, 03/05/2009 [^] [ответить]    [к модератору]  
  • +/
    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/

    real    0m5.502s
    user    0m0.747s
    sys     0m4.310s
    $

     
  • 1.18, XoRe (ok), 16:49, 02/05/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Для разового копирования пойдет)

    А я бы сделал так:
    for a in 'find . ...'
    do
    [ -d $a ] && mkdir /home/temp/$a
    [ -f $a ] && cp $a /home/temp/$a
    done

    Хотя это кому как больше нравится/умеется/привычнее)

    Кстати не указано, файлы созданы за последний месяц, или измененные за последний месяц, или к ним был доступ за последний месяц.

    Хотя судя по тому, что используется ls -l, идет речь об изменении.

     
  • 1.19, Просто Лось. (?), 04:33, 03/05/2009 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    ыы (

    bash: /bin/cp: Слишком длинный список аргументов

    Для реально большой кучи не канает.

     
     
  • 2.22, XoRe (ok), 16:29, 03/05/2009 [^] [ответить]    [к модератору]  
  • +/
    >ыы (
    >
    >bash: /bin/cp: Слишком длинный список аргументов
    >
    >Для реально большой кучи не канает.

    Значит нужен for - он и 1000000 элементов может обработать)

     
     
  • 3.23, vladis (?), 19:55, 03/05/2009 [^] [ответить]    [к модератору]  
  • +/
    Ыхыхы. Нифига.

    cp обламывается, потому что столько много аргументов не лезет в буфер командной строки шелла. for - [почти] точно такая же команда шелла с точно таким же буфером. Соответственно, for тоже обломается.

    Расово верное решение здесь - передавать стопицот аргументов не через буфер, а через стандартный поток ввода-вывода. В него и двестипицот аргументов влезет:

    ls -l ... | awk {...} | while read f; do something $f; done

     
     
  • 4.25, Alex (??), 17:15, 12/05/2009 [^] [ответить]    [к модератору]  
  • +/
    Супер. Воистину. Ровно стопицот (150000) файлов обработало.

    Интересно, что

    ls -tr /DIR1/DIR2/DIR3/* | while read f; ... - все-таки обломалось.

    А вот

    cd /DIR1/DIR2/DIR3/;
    ls -tr * | while read f; ...

    на ура отработало.

     
  • 1.26, начинающий юзер (?), 10:19, 11/09/2013 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    ... и всё таки хотелось бы увидеть полноценный bash-скрипт для копирования/перемещения файликов с одинаковой датой (или одинаковым месяцем)
     
  • 1.27, Алексей (??), 10:48, 08/05/2014 [ответить] [показать ветку] [···]    [к модератору]  
  • +/
    Здорово было бы еще команду заиметь которая копирует только файлы созданные в настоящий день, т.е. с датой создания совпадающей с датой установленной на сервере.
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2018 by Maxim Chirkov  
    ДобавитьПоддержатьВебмастеруГИД  
    Hosting by Ihor