Это моя ос информация:

sudo uname  -a 
Linux machine 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6
 (2018-10-08) x86_64 GNU/Linux

Файлы, начинающиеся с test в /tmp .

ls -al  test*
-rw-r--r-- 1 debian9 debian9 0 Nov 16 14:43 test1
-rw-r--r-- 1 debian9 debian9 0 Nov 16 14:43 test2
-rw-r--r-- 1 debian9 debian9 0 Nov 11 18:28 test.txt

Я хочу перечислить их с помощью find .

find /tmp -name  "test*" -type f  -exec echo  {} \;
find: ‘echo’: Permission denied
find: ‘echo’: Permission denied
find: ‘/tmp/snap.0_anbox_tzkdA1’: Permission denied
find: ‘/tmp/systemd-private-589e0bcc99cc438d9e12d06af643af76-apache2.service-J7vefp’: Permission denied
find: ‘/tmp/systemd-private-589e0bcc99cc438d9e12d06af643af76-colord.service-xtmKpt’: Permission denied
find: ‘echo’: Permission denied
find: ‘/tmp/pulse-PKdhtXMmr18n’: Permission denied
find: ‘/tmp/systemd-private-589e0bcc99cc438d9e12d06af643af76-rtkit-daemon.service-rVBMKE’: Permission denied
find: ‘/tmp/systemd-private-589e0bcc99cc438d9e12d06af643af76-dovecot.service-zTKk5O’: Permission denied

Почему так много людей find: ‘echo’: Permission denied?
Бесполезно бегать с root

debian9@hwy:/tmp$ su root
Password: 
root@hwy:/tmp# find /tmp -name  "test*" -type f  -exec echo  {} \;
find: ‘echo’: Permission denied
find: ‘echo’: Permission denied
find: ‘echo’: Permission denied

Команда find может перечислить все файлы, начинающиеся с test .

find /tmp -name "test*" -type f
/tmp/test2
/tmp/test.txt
/tmp/test1

Почему -exec echo {} \; не может бежать?

Ничего плохого или что-то еще, как вывод команды ниже.

debian9@hwy:~$ sudo find /tmp  -name "test*" -type f -exec /bin/echo  "{}" \;

Проверьте разрешение.

debian9@hwy:~$ sudo ls -al  /bin/echo
-rwxr-xr-x 1 root utmp 0 Nov 11 18:05 /bin/echo

3 ответа3

2

echo встроен во многие оболочки, поэтому при ежедневном использовании он просто работает. Однако find … -exec echo … \; использует внешний исполняемый файл, такой как /bin/echo .

find: ‘echo’: Permission denied означает, что с разрешениями исполняемого файла что-то не так. Возможно, ваш $PATH приводит вас к некоторому "неправильному" echo или разрешения "правильного" echo неверны. Я предполагаю последнее.

  1. Найдите исполняемый файл; whereis echo работает на многих системах.
  2. Проверьте его разрешения, как с помощью ls -l /bin/echo .
  3. Исправьте права с помощью sudo chmod … . В моем Debian это rwxr-xr-x (755). Пример команды: sudo chmod 755 /bin/echo .
1

Kamil Maciorowski указал вам правильное направление (отсюда мой +1 за него), но, похоже, что-то очень неправильно с вашей командой /bin/echo : вот мое,

# ls -l echo
  -rwxr-xr-x 1 root root 35000 gen 18  2018 echo

и вот ваше (и я цитирую):

$ sudo ls -al  /bin/echo
  -rwxr-xr-x 1 root utmp 0 Nov 11 18:05 /bin/echo

Вы видите различия? Ваша команда принадлежит группе utmp , а не корневой группе. Кроме того , и, что не менее важно, его размер равен нулю , тогда как в моем случае он составляет 35000 байт.

Итак, чтобы быть ясным: ваша команда /bin/echo полностью пуста, и она принадлежит к неправильной группе. Это ясно указывает на серьезное повреждение системных инструментов. На основании предоставленной информации я ничего не могу предложить. Чистая переустановка может быть вашим лучшим вариантом.

0

Нет необходимости в -exec echo , в find вы можете использовать -print (или -ls если вам нужна дополнительная информация). Другими словами:

find $dir -print

а также

find $dir -exec echo {} \;

имеют одинаковый выход. Это даже по умолчанию, если вы не указали -exec

find $dir -exec echo {} \;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .