3

У меня проблемы с выполнением команды, которая выдаст мне последний файл из другого каталога.

Пример:

ls -tr | tail -n 1  /prj/somedir/anotherdir/closerdir/targetdir

в targetdir есть список файлов, и мне нужно изолировать самый новый файл из списка.

Когда я набираю команду, проблема в том, что я использую команду tail для каталога.

Пример 2:

ls -tr | tail -n 1 

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

Любые предложения о том, как я могу выполнить эту задачу?

4 ответа4

2

Вы не указываете оболочку, поэтому я советую вам использовать Zsh:

ls /path/to/*(.om[1]) 

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

> ls tmp/378142 
total 0
drwxr-xr-x   7 johnsyweb  staff  238 14 Jan 08:23 ./
drwx------  24 johnsyweb  staff  816 14 Jan 08:20 ../
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082237.txt
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082238.txt
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082239.txt
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082240.txt
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082241.txt

Используя echo:

> echo tmp/378142/*(.om[1])
tmp/378142/082241.txt

Используя ls:

> ls -laF tmp/378142/*(.om[1]) 
-rw-r--r--  1 johnsyweb  staff  0 14 Jan 08:22 tmp/378142/082241.txt

Объяснение:

Это использует расширение имени файла Zsh.

Звездочка распространяется на все элементы в каталоге:

> echo tmp/378142/*        
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt

Модифицируя это с . , означает все обычные файлы (без каталогов или символических ссылок). Это известно как глобальный флаг:

> echo tmp/378142/*(.)  
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt

o задает порядок сортировки, on это по имени:

> echo tmp/378142/*(.on)
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt

om сортирует по измененному времени (Om) в обратном порядке:

> echo tmp/378142/*(.om)
tmp/378142/082241.txt tmp/378142/082240.txt tmp/378142/082239.txt tmp/378142/082238.txt tmp/378142/082237.txt

[1] выбирает первый элемент в списке:

> echo tmp/378142/*(.om[1])
tmp/378142/082241.txt
1

Мне неясно, что вы хотите. Если вы хотите, чтобы имя самого последнего файла в каталоге

  ls -t /prj/somedir/anotherdir/closerdir/targetdir | head -n 1
0
find /your/path -type f -exec ls -l \{\} \;

Должен дать вам хорошее начало (только файлы перечислены с подробным выводом ls . Не просто отсортировать вывод, а вывести необходимую строку.

0

Ответ очень прост - вам нужно указать путь к соответствующему каталогу сразу после команды ls -t иначе ls , что вы имеете в виду текущий каталог. Затем head прочитает вывод ls и отобразит верхнюю строку. Отсюда и путаница. Тогда нужно просто сделать это правильно:

$ ls -t /prj/somedir/anotherdir/closerdir/targetdir | head -n 1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .