Я пытаюсь создать макрос для Маэстро Клавиатуры для OS X, делающего следующее:
Одна из его опций состоит в том, чтобы "Выполнить сценарий оболочки", таким образом, я думал, что это сделает это для 1. После поиска с помощью Google вокруг немного я придумал это:
cd /path/to/directory/
ls -t | head -n1
Это сортирует его правильный, и возвращает первое имя файла. Однако это также кажется, включает разрыв строки, который я не хочу. Что касается 2: Я могу произвести текст "новейший файл": с другим действием в приложении и вставкой имя файла позади этого. Но я задаюсь вопросом, не можете ли Вы возвратить "случайный текст" + результат ls
команда.
Таким образом, мой вопрос: я могу сделать это единственное использование ls
команда? И как я получаю просто название последнего файла без каких-либо разрывов строки или возвратов?
Поскольку вы уже используете 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}'
Вы можете сделать это в 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)"
cd /path/to/directory/
echo -n "random text goes here" $(ls -t | head -n1)
Если хотите, вы можете таким же образом добавить текст в конце.
Вы не можете этого сделать, используя только ls
. Однако, поскольку echo
обычно встроен в оболочку, на самом деле он не добавляет никаких накладных расходов в сценарий. Чтобы получить только имя файла, я бы предложил:
echo -n "newest: $(ls -t1 | head -n1)"
Если по какой-то причине вы действительно хотите удалить head
, тогда, я полагаю, вы могли бы пойти что-то вроде:
ls -t1 | ( read n; echo -n "newest: $n")
( read
встроен в оболочку, head
- нет.)
Обратите внимание, что эти решения не рекурсивно переходят в подкаталоги, поскольку это не было указано в вопросе. Фактически, подкаталоги могут быть напечатаны как самые новые «файлы».