2010-05-15 4 views
4

Я пытаюсь создать макрос для Keyboard Maestro для OS X делает следующее:Как получить имя самого нового файла через терминал?

  1. Получить имя нового файла в директории на моем диске, основанной на дате создания;
  2. Вставить текст «новейший файл:» плюс имя самого нового файла.

Одним из его вариантов является «Выполнить скрипт», поэтому я думал, что будет делать это за 1. После погуглить вокруг немного, я пришел с этим:

cd /path/to/directory/ 
ls -t | head -n1

Это сортирует его и возвращает первое имя файла. Однако, похоже, он также включает разрыв строки, который я не хочу. Что касается 2: я могу вывести текст «новейший файл:» с другим действием в приложении и вставить имя файла за ним. Но мне интересно, не можете ли вы вернуть «случайный текст» + результат команды ls.

Так что мой вопрос: могу ли я сделать это только с помощью команды ls? И как я могу получить только имя последнего файла без каких-либо разрывов строк или возврата?

+0

Чтобы получить случайный текст, вы можете сделать что-то вроде: 'head -c 12/dev/urandom | base64'. О, подождите, вы имеете в виду * произвольный * текст. Извините, я был в замешательстве. –

ответ

9

Поскольку вы уже используете трубы, просто бросить еще один в там:

ls -t | head -n1 |awk '{printf("newest file: %s",$0)}' 

(Обратите внимание, что «Printf» не включает в себя «\ п» в конце, то избавляется от LINEBREAK)

Edit:

с предложением Arkku, чтобы выйти AWK после первой строки, он выглядит следующим образом:

ls -t | awk '{printf("newest file: %s",$0);exit}' 
+0

Зачем использовать 'head -n1' вообще, когда вы можете просто« выходить »из awk после первой строки? – Arkku

+0

Спасибо, отлично работает! – Alec

+0

Спасибо. как сохранить его в переменной вместо ее печати? – Dejell

4
cd /path/to/directory/ 
echo -n "random text goes here" $(ls -t | head -n1) 

Если вы хотите, вы можете добавить текст на конце таким же образом.

+0

Спасибо! Это по-прежнему было связано с возвратом по какой-либо причине в приложении, хотя -n не показывал его в самом терминале. Но эхо, сопровождаемое командой, пригодится и для некоторых других вещей :) – Alec

-1

Вы не можете сделать это только с ls. Однако, поскольку echo, как правило, встроен в оболочку, на самом деле он не добавляет никаких накладных расходов в скрипт. Для того, чтобы получить только имя файла, я хотел бы предложить:

echo -n "newest: $(ls -t1 | head -n1)" 

Если по какой-то причине, вы действительно хотите, чтобы устранить head, то я полагаю, вы могли бы пойти на что-то вроде:

ls -t1 | (read n; echo -n "newest: $n") 

(read встроен в корпус, head не является.)

Обратите внимание, что эти решения не рекурсию в подкаталогах, так что не было указано в вопросе. Фактически, подкаталоги могут быть напечатаны как новейший «файл».

+0

Итак, кто-то заверил это (и некоторые другие ответы) более 7 лет спустя. Я хотел бы отметить, что этот ответ был отправлен главным образом для ответа на точный вопрос «могу ли я сделать это только с помощью команды' ls' »(принятый ответ с использованием' awk', на который я внес предложение, уже был опубликован). Это не моя вина, если это не отвечает на другой вопрос, даже если вопрос появляется в результатах поиска. – Arkku

2

Вы можете сделать это в Баш в одном операторе, как так:

echo -n "newest file: $(ls -t |head -n1)" 

Вы также можете удалить эту строку без echo:

ls -t |head -n1 |tr -d '\n' 

ls Убедитесь, что не выводит цвета не (т. е. указать цвет на ls --color=never или ls --color=auto или вообще нет).

Решение ls выдаст файлы любые вид отсортирован по времени модификации. Если вы хотите только обычные файлы, или если вы не хотите, каталоги, то вы можете использовать find и xargs:

echo -n "newest file: $(find . -maxdepth 1 -type f -print0 |xargs -0 ls -t)" 
3

Использование выхода из ls плохая практика.

find -type f -printf '%T+ %p\n' | sort -r | head -n 1

-1

Поскольку это приходит первым, когда я ищу «найти новейший файл на макинтош оболочки», то я думал, что я вывесил бы для других, чтобы помочь ...

Если вы пытаетесь найти файл только в том, что каталог ls хорош, но я обнаружил, что поиск работает очень хорошо, и вы можете узнать что-то новое в этом процессе. Я, однако, должен был найти GNU find на своем mac, чтобы использовать строку кода, которую diimdeep опубликовал выше.

Если вы запустили Homebrew, что вам нужно, если вы проводите какое-либо время в терминале или, возможно, одну из альтернатив. Вы можете запустить «заварить установить Findutils» После завершения этой код из выше будет работать, как это ...

sudo /usr/local/opt/findutils/bin/gfind -type f -printf '%T+ %p\n' | sort -r | head -n 1 

Просто измените последний бит на 10, если вы хотите больше. gfine возьмет путь, если вам нужно это указать. Я обычно подключаюсь к папке, в которой я хочу начать. Найти автоматически рекурсивно.

Смежные вопросы