В моем предыдущем вопросеКак в find -exec заменить текущий файл на {}?, я спрашивал о тесте с find
. Я хочу найти все файлы, которые мне не принадлежат. Поэтому есть правильная команда find:
find . -type f ! -user "$USER"
но и этот тоже должен быть таким:
find . -type f -exec bash -c '
for pathname do
[[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
done' bash {} +
однако оба варианта дают разные результаты.
1) если я это сделаю [command one] | wc -c
--> 4121
Но: [command two] | wc -c
--> 236768 (P.S. Я ищу файлы в моем $HOME).
Оба приводят разные цифры количества найденных файлов.
2) Оба по-прежнему предоставляют файлы результатов, которыекаталоги(да, каталоги, которыми я не владею, и поэтому - доступ запрещен). Они выдают каталоги, несмотря на то, что find . -type f
в аргументе опции есть файлы типа (не каталоги), почему? (Когда я выбираю ls -ld
один из этих каталогов, ни один из них не является ссылкой или чем-то еще)
решение1
Хм... в моем домашнем каталоге обе команды работают одинаково. 8-/
Тем не менее, вам следует перенаправить stderr в /dev/null и использовать wc -l
для правильного подсчета вывода.
find . -type f ! -user "$USER" 2>/dev/null | wc -l
find . -type f -exec bash -c '
for pathname do
[[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
done' 2>/dev/null bash {} + | wc -l
Отсюда вы можете перенаправить результаты в текстовые файлы и сравнить файлы, чтобы найти различия.
find . -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find . -type f -exec bash -c '
for pathname do
[[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt
Если есть различия, возьмите некоторые из лишних файлов /tmp/file_2.txt и выясните, почему файл не считается «Истиной, если файл существует и принадлежит эффективному идентификатору пользователя».
решение2
Чтобы избежать необходимости find
входить в каталоги, которые на самом деле вам недоступны, вы можете использовать ! -executable -prune
:
find . ! -executable -prune -type f ! -user "$USER"
Отрицательный -executable
тест будет истинным для каталогов, к которым у вас нет доступа, и -prune
удалит их из find
дерева поиска, предотвратив попытки утилиты получить к ним доступ и, таким образом, избежав возникновения ошибок прав доступа.
Тест -executable
(а также аналогичные -readable
тесты -writable
) являются нестандартными и требуют GNU find
.
Я (пока) ничего не могу сказать о различиях в результатах, поскольку вы ничего не сказали об этом. Поскольку вывод так сильно различается по размеру, должно быть тривиально найти и изучить случаи, когда одна команда нашла что-то, чего не нашла другая команда.