Разница между точкой и звездочкой в ​​команде поиска

Вы можете сделать это с помощью утилиты at.

Для одной команды сделайте:

at 'now + 2 hours' -f /path/to/uninstall.sh

Для нескольких команд передайте ваш сценарий в оболочку через cat heredocument:

cat << EOF | at 'now + 2 hours'
command1
command2
........
EOF

Альтернативно, вы можете добиться этого с помощью systemd (опять же, если он у вас установлен)

systemd-run --on-active=2h -- /bin/bash /path/to/uninstall.sh
1
27.02.2017, 17:47
2 ответа

Точка обозначает текущий каталог. Обычно его используют как начальный ПУТЬ для find .

Незакрашенная звездочка будет расширена оболочкой до выполнения find в содержимое текущего каталога. Это называется «глобусом». Чтобы увидеть эффект, выполните:

echo *

Несомненно, find * ... - это не то, что вы хотите использовать.

1
27.01.2020, 23:34

В:

find * ...

в качестве командной строки оболочки, * представляет собой глобус, который расширяется оболочкой до (лексически отсортированного) списка не скрытых записей в текущем каталоге (с некоторыми оболочками , это будут только записи, содержащие только допустимые символы, такие как * , поскольку шаблон означает 0 или более символов ).

Итак, если текущий каталог содержит эти записи:

  • .
  • ..
  • .htaccess
  • file.txt
  • -foo-

find будет вызываться со следующими аргументами: find , -foo- , file.txt ... ). find , скорее всего, будет жаловаться на то, что -foo- является недопустимой опцией или предикатом.

Даже если вы используете:

find -- * ...

Это не будет работать должным образом для файлов с именами -anything или ! или ( ... как - только сообщает find , чтобы прекратить поиск параметров (например, -L , ] -H ) не для предикатов.

Вы можете использовать:

find ./* ...

, чтобы избежать проблем, но опять же, это опускает скрытые файлы, может пропускать файлы с недопустимыми символами или прерывать (с arg list too long ), если в текущем каталоге много файлов.

With:

find . ...

Вы передаете только . в find . . - это текущий каталог. Тогда это find , а не оболочка, которая будет искать в нем файлы (включая . на глубине 0, все записи, кроме . и .. (включая другие скрытые записи) на глубине 1, а все остальные записи для подкаталогов (все еще исключая . и .. ) рекурсивно.

Вам нужно использовать только:

find ./* ...

Если вы хотите, чтобы список файлов на глубине 1 (и только на глубине 1) был отсортирован, и хотите исключить скрытые файлы на глубине 1 (и снова только на глубине 1) . Что было бы очень маловероятно.

Если вы хотите исключить скрытые файлы, добавьте ! -name '. *' Или -name '[!.] *' (но будьте осторожны с именами файлов с недопустимыми символами, и это также будет включать каталог верхнего уровня, заданный для find . , что соответствует этому шаблону).

Если вам нужна сортировка на каждом уровне, вы, вероятно, захотите прибегнуть к zsh и его рекурсивному подстановке с квалификаторами glob.

Причина, по которой вы получаете разные результаты, скорее всего, заключается в том, что в find * поиск начинается с поиска (получает указание искать) в первом файле или каталоге в текущем каталоге в в алфавитном порядке , а с найти. , он смотрит на . , но затем первый файл или каталог в нем в другом порядке (это может быть порядок, в котором записи хранятся в каталоге, но некоторые реализации find также сортируют список по номеру inode как попытка свести к минимуму диск головки ищет).

Кстати, лучше всего написать команду:

find . \( -name @eaDir -o -iname .DS_Store -o -iname Thumbs.db \) \
  -prune -o -mtime -25 -type f -print

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

4
27.01.2020, 23:34

Теги

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