Команда unix, чтобы найти самый последний созданный каталог - PullRequest
9 голосов
/ 31 марта 2011

Я хочу скопировать файлы из самого последнего созданного каталога .Как бы я сделал это в Unix?

Например, если у меня есть имена каталогов в качестве отметки даты как таковой:

/20110311
/20110318
/20110325

Ответы [ 8 ]

10 голосов
/ 01 апреля 2011

Это ответ на вопрос, который, я думаю, вы задаете.

Когда я имею дело со многими каталогами, в имени которых есть метки даты / времени, я всегда использую подход, который у вас есть: ГГГГММДД - замечательно, что порядок даты также алфавитный порядок. В большинстве оболочек (конечно, в bash, и я уверен на 90% в других), расширение '*' выполняется в алфавитном порядке, и по умолчанию ' ls ' возвращает алфавитный порядок. Следовательно

    ls | head -1
    ls | tail -1

Укажите самые ранние и самые поздние даты в каталоге.

Это можно расширить, чтобы сохранить только последние 5 записей и т. Д.

6 голосов
/ 31 марта 2011
lastdir=`ls -tr <parentdir> | tail -1`

Я не знаю, как сделать так, чтобы обратные ходы играли хорошо с системой комментариев.Просто замените эти апострофы на кавычки.

3 голосов
/ 24 сентября 2012

Проблема с решениями на основе ls заключается в том, что они не фильтруют только по каталогам. Я думаю это:

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat -c "%Y %n" {} \;  |sort -n -r |head -1 |awk '{print $2}'`/* /target-directory/.

может сработать, хотя учтите, что это будет копировать файлы только в ближайший каталог. Если вам нужен более общий ответ для копирования чего-либо из вашего нового каталога в новый каталог, я думаю, вам лучше использовать rsync, например:

rsync -av `find . -mindepth 1 -maxdepth 1 -type d  -exec stat -c "%Y %n" {} \;  |sort -n -r |head -1 |awk '{print $2}'`/ /target-directory/ 

но это немного зависит от того, какое поведение вы хотите. Объяснение вещей в кавычках:

  • . - текущий каталог (здесь вы можете указать абсолютный путь)
  • -mindepth/-maxdepth - ограничить команду поиска только непосредственными дочерними элементами текущего каталога
  • -type d - только каталоги
  • -exec stat .. - выводит измененное время и имя каталога из find
  • sort -n -r |head -1 | awk '{print $2}' - дата упорядочивает каталог и выводит имя самого последнего измененного
3 голосов
/ 31 марта 2011

После некоторых экспериментов я придумал следующее:

Команда unix stat полезна здесь. Опция '-t' заставляет stat печатать свой вывод в кратком режиме (все в одной строке), а 13-й элемент этого краткого вывода - это метка времени unix (секунды с начала эпохи) для последнего изменения время. Эта команда перечислит все каталоги (и подкаталоги) в порядке от самых новых модифицированных до самых старых модифицированных:

find -type d -exec stat -t {} \; | sort -r -n -k 13,13

Надеемся, что "краткий" режим stat останется неизменным в будущих выпусках stat !

Вот некоторые пояснения используемых параметров командной строки:

find -type d                # only find directories
find -exec [command] {} \;  # execute given command against each *found* file.
sort -r                     # reverse the sort
sort -n                     # numeric sort (100 should not appear before 2!)
sort -k M,N                 # only sort the line using elements M through N.

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

| head --lines=1 | sed 's/\ .*$//'
2 голосов
/ 31 мая 2012

Если ваши каталоги названы YYYYMMDD, как подсказывает ваш вопрос, воспользуйтесь алфавитным сглаживанием.

Поместите все каталоги в массив, а затем выберите первый :

dirs=(*/); first_dir="$dirs";

(На самом деле это сокращение для first_dir="${dirs[0]}";.)

Аналогично, для последнего :

dirs=(*/); last_dir="${dirs[$((${#dirs[@]} - 1))]}";

Уродливый синтаксис, но он разбивается на:

# Create an array of all directories inside the working directory.
dirs=(*/);

# Get the number of entries in the array.
num_dirs=${#dirs[@]};

# Calculate the index of the last entry.
last_index=$(($num_dirs - 1));

# Get the value at the last index.
last_dir="${dirs[$last_index]}";

Я знаю, что это старый вопрос с принятым ответом, но я думаю, что этот метод предпочтительнее, поскольку он делает все в Bash. Нет причин для запуска дополнительных процессов, не говоря уже о , анализирующем вывод ls. (Что, по общему признанию, должно быть хорошо в этом конкретном случае YYYYMMDD имен.)

0 голосов
/ 21 октября 2014
find ~ -type d | ls -ltra

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

0 голосов
/ 21 октября 2014

Я написал команду, которую можно использовать, чтобы определить, какая папка или файлы создаются в папке как самая новая.Это кажется чистым :)

#/bin/sh
path=/var/folder_name

newest=`find $path -maxdepth 1 -exec stat -t {} \; |sed 1d |sort -r -k 14 | head -1 |awk {'print $1'} | sed 's/\.\///g'`

find $path -maxdepth 1| sed 1d |grep -v $newest
0 голосов
/ 26 июня 2013

попробуйте с помощью следующей команды
ls -1tr | хвост -1

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