Дублируйте записи результатов с помощью команды поиска

Почему я получаю почти повторяющиеся записи (начиная с начальной точки или без нее) следующей командой, пожалуйста:

find .  * -type f | grep '082235'
./Takeout-1/Google Photos/2017-12-07/20171207_082235.jpg.json
./Takeout-2/Google Photos/2017-12-07/20171207_082235.jpg
Takeout-1/Google Photos/2017-12-07/20171207_082235.jpg.json
Takeout-2/Google Photos/2017-12-07/20171207_082235.jpg

Есть ли твик / опция с find, чтобы избавиться от каждого дубликата?

2 ответа

Решение

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

Наиболее тривиальным примером является то, что если вы находитесь в каталоге, содержащем файл foo,

$ find foo foo

сгенерирует следующий вывод:

foo
foo

Запустив команду find . * вы предоставляете в качестве отправных точек: во-первых, текущий каталог, .; и во-вторых, все не скрытые файлы в этом каталоге. Это естественно создаст дублированные результаты: каждый обычный файл найден с . в качестве отправной точки, которая не является скрытым файлом на верхнем уровне (т.е. ./.bar файлы) и не содержится в скрытом каталоге на верхнем уровне (т.е. ./.baz/ каталоги) также появятся во второй части списка без ведущих ./,

Вы, вероятно, просто хотите бежать

$ find . -type f

Обратите внимание, что если вы работали find . * не выбирая обычные файлы с -type f при условии, что существует элемент, не обязательно включающий скрытые файлы или каталоги, которые появляются только один раз: . запись.

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

Другие вопросы по тегам