
Я пытаюсь понять, как использовать find -maxdepth 0
option.
У меня следующая структура каталогов.
--> file1
--> parent
--> child1
--> file1
--> file2
--> child2
--> file1
--> file2
--> file1
Теперь я выполняю find
команду, как показано ниже.
find ./parent -maxdepth 0 -name "file1"
find ./ -maxdepth 0 -name "file1"
find . -maxdepth 0 -name "file1"
Ни при одной из вышеперечисленных find
командфайл1возвращается.
На странице руководства find
я вижу следующую информацию.
-maxdepth 0 означает применять тесты и действия только к аргументам командной строки.
Я искал примеры с -maxdepth 0
опциями, но не смог найти ни одного подходящего примера.
Моя find
версия такова,
find --version
find (GNU findutils) 4.4.2
Может ли кто-нибудь подсказать, в каких случаях -maxdepth 0
этот вариант будет полезен?
РЕДАКТИРОВАТЬ
Когда я выполняю команду ниже, я получаюфайл1попадание в список дважды. Это так и должно работать?
find . file1 -maxdepth 1 -name "file1"
./file1
file1
решение1
Предположим, что file1
в текущем каталоге у нас есть. Тогда:
$ find . -maxdepth 0 -name "file1"
$ find . file1 -maxdepth 0 -name "file1"
file1
Теперь давайте посмотрим, чтодокументациясостояния:
-maxdepth 0
означает применять тесты и действия только к аргументам командной строки.
В моем первом примере выше был указан только каталог.
указан в командной строке. Так как.
не имеет имени file1
, ничего не указано в выводе. В моем втором примере выше, оба.
и file1
перечислены в командной строке, и, поскольку file1
они соответствуют -name "file1"
, они были возвращены в выходных данных.
Другими словами, -maxdepth 0
средства делаютнетпоиск каталогов или подкаталогов. Вместо этого ищите только соответствующий файл среди тех, которые явно указаны в командной строке.
В ваших примерах в командной строке были перечислены только каталоги и ни один из них не был назван file1
. Поэтому и вывода нет.
В общем, в командной строке можно указать множество файлов и каталогов. Например, здесь мы попробуем find
команду с девятью файлами и каталогами в командной строке:
$ ls
d1 file1 file10 file2 file3 file4 file5 file6 file7
$ find d1 file1 file10 file2 file3 file4 file5 file6 file7 -maxdepth 0 -name "file1"
file1
Перекрывающиеся пути
Учитывать:
$ find . file1 -maxdepth 0 -iname file1
file1
$ find . file1 file1 -maxdepth 0 -iname file1
file1
file1
$ find . file1 file1 -maxdepth 1 -iname file1
./file1
file1
file1
find
будет следовать каждому пути, указанному в командной строке, и искать совпадения, даже если пути ведут к одному и тому же файлу, как в . file
, или даже если пути являются точными дубликатами, как в file1 file1
.
решение2
Если вы хотите нерекурсивно найти файлы (не каталоги) внутри каталога, используйте:
find . -maxdepth 1 -type f -name "file1"
# ./file1
-maxdepth 0
не будет искать. Он попытается сопоставить только те имена файлов/каталогов, которые вы указали в качестве аргументов в find
.
Например, в приведенном выше утверждении при использовании maxdepth
значения 0
будет произведена попытка сопоставления file1
с .
, которое не соответствует.
Однако,передача *
вместо .
в сочетании с -maxdepth 0
заставит bash заменить *
его списком файлов в текущем каталоге, что вернет совпадение.
решение3
John1024 привел хорошие примеры,какдля использования -maxdepth 0
, поэтому я только добавляю информациюкогдачтобы использовать его:
Ну, в чем причина -maxdepth 0
? Если вы знаете имя, вы можете просто дать команду
ls file-*
Ну, возможно, это не то имя, которое вы ищете.
Пример:
touch file-{1..3}
echo "1" > file-1
touch -d @0 file-2
find * -maxdepth 0 -name "file-*" \( -size 1k -o -mtime +10000 \) -ls
669266 12 -rw-rw-r-- 1 stefan stefan 2 Mai 4 20:57 file-1
669270 8 -rw-rw-r-- 1 stefan stefan 0 Jan 1 1970 file-2
Я создаю 3 файла с именем pattern file-*. Затем я добавляю немного контента в № 1, сбрасываю дату для № 2 и оставляю № 3 как есть.
Теперь я ищу файлы размером 1k (№ 1) или возрастом > примерно 30 лет среди, может быть, 1000 файлов. Например, только среди 3 файлов.
Но find * ищет каждый файл в текущем каталоге, отсюда и несколько чуждый жаргон man-страницы "начальная точка", а не просто каталоги. Я полагаю, что мощные возможности фильтра find привели к решению искать файлы, о которых вы знаете, где они находятся ($PWD), но вы не можете легко отфильтровать другие атрибуты с помощью стандартных инструментов оболочки.