кавычки в обратных галочках в указывают в ksh

Я пытаюсь получить файл текущей даты со следующей командой в Unix HP-UX:

$ ls -lrt ABC.LOG* |grep "`date +"%b %d"`"

Но, это дает мне ошибку:

ksh: : cannot execute
grep: can't open %d

Какие-либо предложения?

4
de

3 ответы

Ошибка происходит от цитирования аргументов grep и то, что обратные галочки не делают вложения очень хорошо:

grep "`date +"%b %d"`"

Это лучше написано как

grep "`date +'%b %d'`"

... или еще лучше,

grep "$(date +'%b %d')"

На самом деле, с $ (...) вместо обратных галочек, необходимо быть в состоянии держать внутренние двойные кавычки:

grep "$(date +"%b %d")"

Альтернатива захвату продукции ls должна была бы сделать

find . -type f -name "ABC.LOG*" -ctime -1

Это нашло бы все обычные файлы ( - тип f ) в текущем каталоге, имена которого соответствует данному образцу и чей ctime - меньше чем 24 часа с текущего времени . ctime файла - время, когда последнее изменение данных или метаданных файла было сделано.

Это не точно эквивалентно тому, чего вы пытаетесь достигнуть все же. Это также повторно проклинает в подкаталоги.

7
добавлено
@waltinator Не с дефолтом находят на HP-UX.
добавлено автор Tejaswi Yerukalapudi, источник
@Ashish don't parse ls result, + вы получите этот неправильный результат ПОЛЬЗОВАТЕЛЬСКИЙ ПОЛЬЗОВАТЕЛЬ-RW-RW-RW-1 118 20 июля 15:31 fileAug 20
добавлено автор pablo, источник
I' m на самом деле разбирающий дату через ls-lrt , так grep "$ (дата + "%b %d")" или grep" дата + ' %b %d' " сделает для меня.
добавлено автор Erik B, источник
@Kusalananda, которые вы могли ограничить текущим каталогом , находят.-maxdepth 1...
добавлено автор GhostLyrics, источник

находят , команда может использоваться для правильного инструмента, вместо того, чтобы делать ls и grep результат луга, таким образом, хорошо отметить что, пожалуйста don't parse ls result.

find /path/to/ -type f -name "ABC.LOG*$(date +"%b %d")*"

Выше ищет сегодняшнюю дату в filesname , если вы ищете файлы, создал/изменил на сегодняшней дате, вы могли бы использовать , находят как этот путь (версия ГНУ находят ):

find /path/to -type f -name "ABC.LOG*" -newermt 00:00

Или за прошлые 24 Часа:

find /path/to -type f -name "ABC.LOG*" -newermt yesterday

Или следующим образом:

find /path/to -type f -name "ABC.LOG*" -newermt "$(date +"%b %d")"
4
добавлено
@Sté phaneChazelas Спасибо, добавил я это ответить
добавлено автор pablo, источник
Обратите внимание на это с -newermt вчера , that' s файлы, в последний раз измененные за прошлые 24 часа (кроме приблизительно изменений DST), не файлы, в последний раз измененные сегодня. Для этого, you' d хотят -newermt 0:00
добавлено автор Stéphane Chazelas, источник
Также отметьте это в то время как -newerxy likely originated in HP/UX find, вариант, где y == t все еще не поддерживается там AFAIK (добавленный к FreeBSD сначала, теперь также поддержанный ГНУ).
добавлено автор Stéphane Chazelas, источник

В раковине Korn, как в Оболочке Bourne, кавычки и обратные галочки (архаичная форма замены команды) могут быть непревзойденными, и необходимо помочь tokeniser сказать, где обратные галочки заканчиваются. В обратных галочках есть другой уровень обработки наклонной черты влево.

echo "`date"

работы и совпадают с:

echo "`date`"
echo "$(date)"

И:

echo `echo "foo`

работы и совпадают с:

echo `echo "foo"`
echo $(echo "foo")

Если вы делаете:

grep "`date +"%b %d"`"

Это взято в качестве grep слово и затем "'дата + " (открытые обратные галочки в двойных кавычках) связанный с %b и затем %d связанный с другой открытые обратные галочки в двойных кавычках: "'" . Таким образом, это похоже

grep "$(date +)"%b %d"$()"

(за исключением того, что по некоторым причинам, в то время как повторяют"''" или , эхо "$ ()" не вызвало бы ошибку в эхо"'" , раковина попытается выполнить команду с пустым названием (как будто вы написали эхо "$ ("")" ).

Таким образом, здесь, необходимо использовать наклонную черту влево, чтобы помочь анализатору:

grep "`date +\"%b %d\"`"

Те наклонные черты влево на самом деле удалены. Это дату + "%b %d" , который оценивается подраковиной в замену команды.

Здесь, начиная с ksh принимает открытые кавычки, вы могли на самом деле также сделать:

grep "`date +\"%b %d"

(не, что я советовал бы делать это).

Это также, как можно получить вложенные обратные галочки как в:

echo "`echo \"\`echo \\\"a  b\\\"\`\"`"

Хороший пример, почему никто почти никогда не использует тот синтаксис и использует $ (...) более новая форма (введенный ksh в начале 80-х):

echo "$(echo "$(echo "a  b")")"

Теперь, для вашей конкретной проблемы, похоже, что вы хотите перечислить ABC.LOG* файлы в текущем каталоге, которые были изменены в последний раз сегодня. Для этого вы могли сделать:

touch -t "$(date +%Y%m%d0000)" .start-of-day &&
  find . ! -name . -prune -name 'ABC.LOG.*' \
    -newer .start-of-day -type f -exec ls -lrtd {} + &&
  rm -f .start-of-day
4
добавлено