Абсолютный путь
/
/../
или /./
.. /
или ./
/ ..
или /.
, чтобы вы могли сделать это (переносимо) с помощью оператора case:
case "x$1" in (x*/..|x*/../*|x../*|x*/.|x*/./*|x./*) rc=1 ;; (x/*) rc=0 ;; (*) rc=1 ;; esac return $rc
Это намеренно исключает такие вещи, как
/../../../foo/../../../bar
, которые допускает наивная интерпретация "ведущей косой черты".
Краткое определение абсолютного пути см. В realpath в POSIX.
Ошибка возникает из-за цитирования аргументов 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
Это найдет все обычные файлы(-type f
)в текущем каталоге, чьи имена соответствуют заданному шаблону и чье ctime меньше 24 часов с текущего времени . ctime файла — это время последней модификации данных или метаданных файла.
Это не совсем то же самое, что вы пытаетесь достичь. Это также рекурсирует в подкаталоги.
Команду find
можно использовать для правильного инструмента вместо того, чтобы выполнять ls
и grep
результат, поэтому полезно отметить, что, пожалуйста,не анализируйте ls
результат.
find /path/to/ -type f -name "ABC.LOG*$(date +"%b %d")*"
Выше ищется сегодняшняя дата в имя файла , если вы ищете файлы, созданные/измененные сегодняшней датой, вы можете использовать find
таким образом (GNU версияfind
):
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")"
В оболочке Korn, как и в оболочке Bourne, кавычки и обратные кавычки (архаичная форма подстановки команд )может быть непревзойденной, и вы должны помочь токенизатору определить, где заканчиваются обратные кавычки. Внутри обратных кавычек есть еще один уровень обработки обратной косой черты.
echo "`date"
работает и совпадает с:
echo "`date`"
echo "$(date)"
И:
echo `echo "foo`
работает и совпадает с:
echo `echo "foo"`
echo $(echo "foo")
Если да:
grep "`date +"%b %d"`"
Это взято как grep
слово, а затем"`date +"
(незакрытые обратные кавычки внутри двойных кавычек )объединены с %b
и затем %d
объединены с другими незакрытыми обратными кавычками внутри двойных -кавычек:"`"
. Так что это как
grep "$(date +)"%b %d"$()"
(за исключением того, что по какой-то причине, в то время как echo "``"
или echo "$()"
не вызвали бы ошибку, в echo "`"
оболочка попытается выполнить команду с пустым именем (, как если бы вы написали echo "$("")"
).
Итак, здесь вам нужно использовать обратную косую черту, чтобы помочь синтаксическому анализатору:
grep "`date +\"%b %d\"`"
Эти обратные косые черты фактически удалены. Именно date +"%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