find test и bash test не дают одинаковый результат, почему?

find test и bash test не дают одинаковый результат, почему?

В моем предыдущем вопросеКак в 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.

Я (пока) ничего не могу сказать о различиях в результатах, поскольку вы ничего не сказали об этом. Поскольку вывод так сильно различается по размеру, должно быть тривиально найти и изучить случаи, когда одна команда нашла что-то, чего не нашла другая команда.

Связанный контент