Я пытаюсь найти во всех подкаталогах текущего каталога каталог с именем 'jdk1.7'. Я написал заявление типа
find -type d -name 'jdk1*'
Но я не получаю никаких результатов. Я проверил, что каталог присутствует в иерархии каталогов текущего каталога.
1 ответ
Есть две возможности:
jdk1.7
не является действительным каталогом.jdk1.7
- это каталог, но не фактический подкаталог.
,
Рассмотрим следующий пример:
$ mkdir a a/jdk
$ touch a/jdk/somefile
$ mkdir b c
$ ln -s ../a/jdk b/
$ ln -s ../a c/
$ find -L | sort
.
./a
./a/jdk
./a/jdk/somefile
./b
./b/jdk
./b/jdk/somefile
./c
./c/a
./c/a/jdk
./c/a/jdk/somefile
$ find a -type d -name jdk
a/jdk
$ find b -type d -name jdk
$ find c -type d -name jdk
Для большинства практических целей jdk
можно рассматривать как подкаталог a
, b
и c
. Однако команда find
будет успешной только для первого.
./b/jdk
- это символическая ссылка на a/jdk
, поэтому она не будет соответствовать предикату -type -type d
. Это будет соответствовать -type l
, но так же будут символические ссылки на файлы.
./c/a/jdk
- это фактический каталог, но ./c/a
это просто символическая ссылка на ./a
. По умолчанию команда find не следует по символическим ссылкам, поэтому она не проверяет видимое содержимое ./c/a
.
Чтобы указать find найти символические ссылки, когда они встречаются, используйте флаг -L
:
$ find -L a b c -type d -name jdk
a/jdk
b/jdk
c/a/jdk