Скопируйте три новейших файла из одного каталога (рекурсивно) в другой указанный каталог - PullRequest
1 голос
/ 22 октября 2010

Я использую bash.

Предположим, у меня есть каталог файлов журнала /var/myprogram/logs/.

В этом каталоге у меня есть много подкаталогов и подкаталогов, которые включают в себя различныетипы файлов журналов из моей программы.

Я хотел бы найти три новейших файла (с последними изменениями), чье имя начинается с 2010, под /var/myprogram/logs/, независимо от подкаталога и копииих в мой домашний каталог.

Вот что я бы сделал вручную
1. Просмотрите каждый каталог и выполните ls -lt 2010*, чтобы увидеть, какие файлы, начинающиеся с 2010, были изменены в последнее время.
2Пройдя все каталоги, я узнаю, какие три файла самые новые.Поэтому я вручную копирую их в свой домашний каталог.

Это довольно утомительно, поэтому я подумал: а может быть, мне удастся как-нибудь передать некоторые команды вместе, чтобы сделать это за один шаг, желательно без использования сценариев оболочки?1019 * Я искал find, ls, head и awk, которые я мог бы использовать, но не нашел правильный способ склеить их.

Дайте мне знать, если мне нужно уточнить.Спасибо.

Ответы [ 3 ]

1 голос
/ 22 октября 2010

Ваши ответы кажутся очень сложными, как насчет

для ФАЙЛА в find . -type d; do ls -t -1 -F $ FILE | grep -v "/" | голова -n3 | xargs -I {} mv {} ..; сделано;

или выложил красиво

  for FILE in `find . -type d`; 
  do
      ls -t -1 -F $FILE | grep -v "/" | grep "^2010" | head -n3 | xargs -I{} mv {} ~;
  done;
1 голос
/ 22 октября 2010

Вот как вы можете это сделать:

 find -type f -name '2010*' -printf "%C@\t%P\n" |sort -r -k1,1 |head -3 |cut -f 2-

Выводит список файлов с префиксом по времени их последнего изменения, сортирует их по этому значению, берет верхние 3 и удаляет отметку времени.

0 голосов
/ 22 октября 2010

Мой самый короткий ответ после быстрого взлома.

for file in $(find . -iname *.php -mtime 1 | xargs ls -l | awk '{ print $6" "$7" "$8" "$9 }' | sort | sed -n '1,3p' | awk '{ print $4 }'); do cp $file ../; done

Основная команда, хранящаяся в $(), выполняет следующие действия:

  1. Findвсе файлы рекурсивно в текущем каталоге соответствуют (без учета регистра) имени * .php и были изменены за последние 24 часа.

  2. Труба в ls -l, требуется для возможности сортировкипо дате изменения, поэтому мы можем иметь первые три

  3. Извлечь дату изменения и имя файла / путь с помощью awk

  4. Sort эти файлы основаны на дате и времени

  5. с sed печатью только первые 3 файла

  6. с awk печать только их имени / пути

  7. Используется в цикле for и в качестве действия скопируйте их в нужное место.

Или используйте вариант @ Hasturkun, который появился в качестве ответапока я редактировал этот пост:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...