Как я получаю название новейшего файла через Терминал?

Я пытаюсь создать макрос для Маэстро Клавиатуры для OS X, делающего следующее:

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

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

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

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

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

7
задан Casimir et Hippolyte 15 November 2014 в 11:52
поделиться

4 ответа

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

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

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

Edit:

С учетом предложения Arkku завершать awk после первой строки, это выглядит так:

ls -t | awk '{printf("newest file: %s",$0);exit}'
10
ответ дан 6 December 2019 в 11:46
поделиться

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

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

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

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

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

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

echo -n "newest file: $(find . -maxdepth 1 -type f -print0 |xargs -0 ls -t)"
2
ответ дан 6 December 2019 в 11:46
поделиться
cd /path/to/directory/
echo -n "random text goes here" $(ls -t | head -n1)

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

4
ответ дан 6 December 2019 в 11:46
поделиться

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

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

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

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

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

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

-1
ответ дан 6 December 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: