Как бы мне перечислить все каталоги, в которых нет файла с указанным именем? например, учитывая это дерево
/
/a
README
file001
file002
/b
README
file001
/c
file003
Я хочу перечислить каталоги, у которых нет файла с именем README
, в этом случае это будет каталог /c
. Как бы я это сделал? Я не могу думать ни о каком синтаксисе, используя, например find
.
Ответы:
Предполагая
find
реализацию, подобную GNU,find
которая принимает{}
встроенный аргумент для-exec
:пример
Здесь каталоги с 1/1 по 5/5 имеют README, остальные каталоги пусты.
Теперь, когда мы запускаем эту версию нашей
find
команды:Ссылки
источник
Вы можете использовать
-exec
опциюfind
для проверки файла, а затем распечатать все результаты, для которых проверка не удалась.источник
Нет необходимости
find
. Просто используйте оболочку:Если вам нужно, чтобы он был рекурсивным, вы можете использовать (для
bash
,zsh
можете сделать это по умолчанию, используйтеset -o globstar
вksh93
):(обратите внимание, что точечные файлы исключены по умолчанию).
источник
Спецификаторы with
zsh
и glob (e
string ):или
добавить,
D
чтобы включить скрытые каталоги:/
выбирает только каталоги иe_'[[ ! -f $REPLY/README ]]'_
далее выбирает только имена каталогов, для которых возвращается код оболочки между кавычкамиtrue
, то есть для каждого имени каталога ($REPLY
), к которому*(/)
расширяется глобус , он запускает[[ ! -f $REPLY/README ]]
и сохраняет имя каталога, если результат таковtrue
.Вторая форма
^e_'.....'_
использует тот же квалификатор glob, отрицается (но на этот раз условное выражение не отменяется:)[[ -f $REPLY/README ]]
.Выше будут возвращаться только имена каталогов в текущем каталоге.
Если вы хотите выполнить рекурсивный поиск (опять же, чтобы включить скрытые каталоги, добавьте
D
классификатор):источник
Портативно, вы могли бы сделать:
[ -f file ]
тесты , если файл существует и подтверждается как обычный файл (после SYMLINK разрешения).Если вы хотите проверить, что он существует только (как запись в этом каталоге), независимо от его типа, вам понадобится:,
[ -e file ] || [ -L file ]
хотя учтите, что для выполнения этих тестов вам нужно разрешение на поиск в каталоге. Вы можете добавить несколько[ -x "$dir" ]
тестов для учета таких случаев, как:Или чтобы избежать состояния гонки, с
zsh
:См. Также Как узнать, если обычный файл не существует в Bash? на ТАК.
источник