Как получить имя новейшего файла через Терминал? - PullRequest
5 голосов
/ 15 мая 2010

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

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

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

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

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

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

Ответы [ 6 ]

10 голосов
/ 15 мая 2010

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

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

(Обратите внимание, что printf не включает в себя '\ n' в конце; это избавляет от переноса строки)

Edit:

С предложением Арку выйти из awk после первой строки это выглядит следующим образом:

ls -t | awk '{printf("newest file: %s",$0);exit}'
4 голосов
/ 15 мая 2010
cd /path/to/directory/
echo -n "random text goes here" $(ls -t | head -n1)

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

2 голосов
/ 18 января 2017

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

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

2 голосов
/ 15 мая 2010

Вы можете сделать это в bash одним оператором, например:

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

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

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

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

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

echo -n "newest file: $(find . -maxdepth 1 -type f -print0 |xargs -0 ls -t)"
0 голосов
/ 27 апреля 2017

Так как это происходит в первую очередь, когда я ищу "найти самый новый файл в оболочке Mac", то я подумал, что я опубликую для других, чтобы помочь ...

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

Если вы запускаете Homebrew, что следует делать, если вы проводите какое-то время в терминале, или, возможно, один из вариантов. Вы можете запустить "brew install findutils" Как только это закончится, код сверху будет работать следующим образом ...

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

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

0 голосов
/ 15 мая 2010

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

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

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

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

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

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

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