Отсутствует аргумент Exec linux

Обновлено: 03.07.2024

Сегодня мне помогли с командой, но, похоже, она не работает. Это команда:

Оболочка возвращается

Что я в основном пытаюсь сделать, так это рекурсивно просмотреть каталог (если в нем есть другие каталоги), запустить команду ffmpeg для типов файлов .rm и преобразовать их в типы файлов .mp3. После этого удалите только что преобразованный файл .rm.

Я ценю любую помощь в этом.


11 ответов 11

Команда -exec должна завершаться символом ; (поэтому вам обычно нужно набирать \; или ';', чтобы избежать интерпретации оболочкой) или + . Разница в том, что с ; , команда вызывается один раз для каждого файла, с + она вызывается как можно меньше раз (обычно один раз, но существует максимальная длина командной строки, поэтому она может быть разделена) со всеми именами файлов. См. этот пример:

В вашей команде две ошибки:

Во-первых, вы используете <>; , но ; должен быть собственным параметром.

Во-вторых, команда заканчивается на && . Вы указали «запустить поиск и, если он прошел успешно, удалить файл с именем <>; .“. Если вы хотите использовать элементы оболочки в команде -exec, вам нужно явно запустить ее в оболочке, например -exec sh -c 'ffmpeg . && гм' .

Тем не менее, вы не должны добавлять <> внутри команды bash, это вызовет проблемы, когда есть специальные символы. Вместо этого вы можете передать оболочке дополнительные параметры после -c command_string (см. man sh ):

В первом примере вы видите, что $ оценивается оболочкой. Представьте, что есть файл с именем $(rm -rf /) :-)

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

Таким образом, ваша команда может выглядеть примерно так:

Но есть способ лучше. найти поддержки и и или , поэтому вы можете делать такие вещи, как find -name foo -or -name bar . Но это также работает с -exec , который оценивается как true, если команда завершается успешно, и как false, если нет. См. этот пример:

Он запускает печать только в том случае, если команда была выполнена успешно, что было выполнено для true, но не для false .

Таким образом, вы можете использовать два оператора exec, объединенных в цепочку с помощью -and , и последний будет выполняться только в том случае, если первый был успешно выполнен.

Я не вижу, что не так с этой командой, так как она соответствует справочной странице:

-exec command <> +

Этот вариант параметра -exec запускает указанную команду для выбранных файлов, но командная строка строится путем добавления имени каждого выбранного файла в конец ; общее количество вызовов команды будет намного меньше, чем количество совпадающих файлов. Командная строка строится почти так же, как xargs строит свои командные строки. В команде допускается только один экземпляр '<>'. Команда выполняется в начальном каталоге.



Вы пытались избежать + в конце? найти/папку b/папку -name *.c -o -name *.h -exec grep -I foobar '<>' \+

Возможно, вы используете старую версию GNU find . Хотя вариант -exec cmd <> + является POSIX и доступен с 80-х годов, GNU find добавил его (относительно) недавно (2005). Что говорит find --version?

@Коверас, тогда все. -exec <> + был добавлен в 4.2.12 в 2005 году. В старых находках GNU вы можете использовать (не POSIX) -print0 | xargs -r0, чтобы получить что-то подобное. 4.1 выпущен в 1994 году.

JRFerguson указал (в ответе, который был удален), что аргументы шаблона -name должны быть заключены в кавычки: -name "*.c" -o -name "*.h" . Это верно, хотя и не связано с ошибкой -exec. Вы заметите, что во всех других ответах подстановочные знаки заключены в кавычки, хотя об этом упоминает только Жиль. … (продолжение)

(продолжение) … ответ jlliagre сворачивает выражение имени в -name "*.[ch]" без объяснения причин. Это имеет преимущества упрощения командной строки и, в частности, устранения -o . Найти выражения, включающие -o, сложно. Ваше неверно; если ваша команда исправлена ​​так, что она не выдает ошибку (как в ответе Жиля), она будет запускать grep только для файлов .h. Вам нужно сделать '(' -name '*.c' -o -name '*.h' ')' .

5 ответов 5

Было несколько проблем с вашими попытками, включая использование обратных кавычек вместо кавычек (удалено в более поздних изменениях вопроса), отсутствие кавычек там, где они необходимы, дополнительные кавычки там, где они бесполезны, отсутствие круглых скобок для группировки предложений -o и используются различные реализации find (подробности см. в комментариях и в чате).

В любом случае, команду можно упростить следующим образом:

или, если вы используете архаичную версию поиска GNU, это всегда должно работать:


На справочных страницах find: «Строка '<>' заменяется текущим именем обрабатываемого файла везде, где она встречается в аргументах команды, а не только в тех аргументах, где она одна, как в некоторых версиях find. Обе эти конструкции, возможно, потребуется экранировать (с помощью '\') или заключить в кавычки, чтобы защитить их от расширения оболочкой."

Я действительно читал это на странице руководства, но дело в том, что я не знаю ни одной оболочки, которая требует цитирования фигурных скобок. Какую оболочку вы используете?

«отсутствует аргумент для -exec » обычно означает, что в аргументе для -exec отсутствует терминатор. Ограничитель должен быть либо аргументом, содержащим только символ ; (которую нужно заключать в кавычки в команде оболочки, поэтому обычно пишется \; или ';' ) или два последовательных аргумента, содержащих <> и + .

Стефан Шазелас определил, что вы используете старую версию GNU find, которая не поддерживает -exec … <> + , только -exec <> \; . Хотя GNU поздно применил -exec … <> + , я рекомендую вам приобрести менее устаревший набор инструментов (например, Cygwin, который включает git и многое другое, или GNUwin32, в котором отсутствует git, но нет вибрация плохого сотрудника, пытающегося использовать Linux, но мы навязываем Windows, которую дает Cygwin). Эта функция была добавлена ​​в версии 4.2.12 более 9 лет назад (это была последняя идентифицированная функция, позволяющая GNU найти POSIX-совместимую).

Если вы хотите придерживаться более старой версии поиска GNU, вы можете использовать -print0 с xargs -0, чтобы получить аналогичную функциональность: групповое выполнение команд, поддержку произвольных имен файлов.

Всегда заключайте в кавычки подстановочные знаки в командной строке поиска. В противном случае, если вы запустите эту команду из каталога, содержащего файлы .c, *.c без кавычек будет расширен до списка файлов .c в текущем каталоге.

Добавление /dev/null в командную строку grep — это трюк, который гарантирует, что grep всегда будет печатать имя файла, даже если find найдет единственное совпадение. Другой способ поиска GNU — передать параметр -H .

Отказ от ответственности: я полный любитель Linux. Привет, в настоящее время я настраиваю сервер PHPIPAM на CentOS 7. Я следую этому руководству: https://hostadvice.com/how-to/how-to-install-phpipam-on-centos-7/, которое говорит мне для запуска команды: "

Когда я это сделаю, появится сообщение:

появляется. Что я могу сделать, чтобы заставить команду работать?


3 ответа 3

Обычно ; действует как разделитель между командами. Однако для find -exec его необходимо указать как фактический параметр самой команды (чтобы указать, где заканчивается параметр -exec). Для этого его нужно либо заключить в кавычки, либо экранировать:

В примере с исходного веб-сайта присутствует буква f, а ; escape/кавычки там также отсутствуют.

Вы также можете использовать find . -введите f -ls, чтобы вывести список всех файлов с разрешениями, или найдите . -type f \( \! -perm 0644 \) -ls чтобы найти те, у которых установлены неожиданные разрешения. Или. вы можете снова запустить исходную команду, но измените chmod на chmod -v и сделайте ее подробной о том, что она на самом деле делает.

Когда я это делаю, появляется сообщение: 'найти: отсутствует аргумент для "-exec".' появляется

Вам не хватает \ перед ; в конце строки (чего нет в цитируемой вами ссылке).

Кроме того, вы не указали аргумент для -type .

Ваша команда должна быть:

-type c Файл имеет тип c, как указано ниже:

b блочный (буферизованный) специальный

c символьный (небуферизованный) специальный

d каталог

p именованный канал (FIFO)

f обычный файл

l символическая ссылка; это никогда не будет верно, если действует опция -L или опция -follow, если только символическая ссылка не нарушена. Если вы хотите искать символические ссылки, когда действует -L, используйте -xtype.

s socket

D door (Solaris)


Да, я забыл написать здесь букву "f", хотя я написал ее в команде. Так что проблема не в этом, все равно спасибо. Решение с \; ';' или ";" вроде сработало.

Должно быть очевидно, что это ошибка копирования.If he actually ran the command as posted, he would have gotten an error about in incorrect argument to -type , not a missing argument to -exec .

The other answers explain why the problem is happening, but there is another solution to the problem. You can use + instead of \; and then you don't have to worry about escaping the ; . For something like chmod over a large number of files, this will likely be somewhat faster, too. You would run it like this:

They're not exactly identical, though. With + the find command is passing multiple files as separate arguments to a single invocation of chmod . A lot of programs can handle this just fine, but some can't. If a program you want to pass to -exec needs to take exactly 1 file argument at a time, then you have to use \; instead.


目前在docker容器中执行的 crontab命令删除定期删除/tmp 目录

查资料发现 \后面需要 ;
正确写法如下:

附录find - exex 后面意思:
-exec 找到后执行命令
rm -rf <>命令就是删除文件
;这是格式要求的,没有具体含义。


02-15 3万+


12-09 110

*/15 * * * * /root/bjpos_ip_check.sh > /dev/null 2>&1 我写了一个shell脚本,使用find命令去某些目录查出特定的文件,并计算它们的md5值,定义了一个crontab任务,不知道为什么,我手动执行任务出现的结果,与crontab自动执行的结果,查出的顺序总是不一样,为此苦恼了很久。 我尝试再脚本加入sort命令进行排序,结果也不管用。 后来发现: 在crontab文件定义多个调度任务时,需要特别注意的一个问题就是环境变量的设


11-07 1531


12-05 1万+

crontab -e添加定时任务后,发现任务没有执行,而手动执行脚本可以成功,此时可以通过以步骤进行排查: 1,检查cron服务是不是在运行 service crond status 在运行的时候会看到crond is running…如cron不在运行启动服务 Service cron start2,检查用户 比如以apps用户登录,crontab -e添加的任务就会以apps用户执行


03-25 1万+

linux使用find命令时,错:find: missing argument to `-exec' 具体执行命令为: Shell代码 find /u03 -name server.xml -exec grep '9080' <>\; 目的是查找/u03目录名称为server.xml的文件,根据查找的结果进行grep搜索,搜索其包含9080


09-13 3万+

问题:find: missing argument to `-exec’ 解决方法: 该行代码为: find $DIR -mtime +$DAYS -type f -name "postgresqlbak" -exec rm < >\; < >之间要加空格,否则会上面的错。.


04-10 1万+

find搜索姿势 默认先处理文件夹,再处理文件夹 find [选项] [路径] [查找条件] [处理动作] find后接命令 find命令强大之处在于 可以在查找到内容后,调用命令对查找到的内容进行进一步的处理 查看find帮助文件 [处理动作]相关内容 actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print -fprint0 FILE -fprint FILE -ls -fls FILE -prune -


01-04 189

一 找到根目录所有的以a开头的文件并把查找结果当做参数传给rm -rf命令进行删除: 1、find / -name “a*” |xargs rm -rf 2、find / -name “a*” -exec rm -rf <> \; 3、rm -rf $(find / -name “a”) 二 如果想指定递归深度,可以这样: 1、find / -maxdepth 3 -name .


10-11 557

如图 删除日志错 解决办法 find /logs/ -mtime +25 -name "*.log" -exec rm -rf <> \; 最后的分号不能省!!! 最后的分号不能省!!! 最后的分号不能省!!!


06-22 120

使用find批量删除指定前缀的文件时,执行 find -name '8017058d*' -exec rm <>\; 命令:find: missing argument to `-exec' 正确的命令如: // 注意<> 与 \之间有空格 find -name '8017058d*' -exec rm <> \; find -name'8017058d*' 当前文件夹以8017058d为前缀的文件 -exec rm 执行rm命令 <> find查找出来的文件.

关于我使用crontab定时任务的那些事儿错:find: missing argument to `-exec'命令可以正确执行,写在脚本无法执行定时任务加sh -x find查找的时候脚本出错单条命令执行是正常的,写到脚本执行出错。把正确执行的脚本复制到其他机器执行也出错解决办法:把正确执行的脚本来,然后上传到错误执行的机器上面。最后通过解决思路:先恢复定.


02-19 67


02-10 135

QUOTE:使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的(在有些操作系统只允许- e x e c选项执行诸如l s或ls -l这样的命令)。大多数用户使用这一选项是为了查找旧文件.


03-01 1万+

 在linux使用find命令时,错:find: missing argument to `-exec' 具体执行命令为: Shell代码 find /u03 -name server.xml -exec grep '9080' <>\; find /u03 -name server.xml -exec grep '9080' <>\; 目的是查


十_。 于 2020-12-07 18:11:32 发布 79 收藏 1

当时是find -exec 缺少参数 然后研究了研究 发现是参数没给对
-exec
参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

exec选项后面跟随着所要执行的命令或脚本,<>,空格 和 \,最后是一个分号;


03-25 1万+

linux下使用find命令时,报错:find: missing argument to `-exec' 具体执行命令为: Shell代码 find /u03 -name server.xml -exec grep '9080' <>\; 目的是查找/u03目录下名称为server.xml的文件,根据查找的结果进行grep搜索,搜索其中包含9080


09-13 3万+

问题:find: missing argument to `-exec’ 解决方法: 该行代码为: find $DIR -mtime +$DAYS -type f -name "postgresqlbak" -exec rm < >\; < >之间要加空格,否则会报上面的错。.


07-07 745


10-11 557

如图 删除日志报错 解决办法 find /logs/ -mtime +25 -name "*.log" -exec rm -rf <> \; 最后的分号不能省!!! 最后的分号不能省!!! 最后的分号不能省!!!


10-31 351


10-12 1595


12-05 1209


11-30 2934


02-15 3万+


11-25 223


03-01 1万+

 在linux下使用find命令时,报错:find: missing argument to `-exec' 具体执行命令为: Shell代码 find /u03 -name server.xml -exec grep '9080' <>\; find /u03 -name server.xml -exec grep '9080' <>\; 目的是查


04-10 1万+

find搜索姿势 默认先处理文件夹,再处理文件夹 find [选项] [路径] [查找条件] [处理动作] find后接命令 find命令强大之处在于 可以在查找到内容后,调用命令对查找到的内容进行进一步的处理 查看find帮助文件 [处理动作]相关内容 actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print -fprint0 FILE -fprint FILE -ls -fls FILE -prune -


03-21 34


03-18 1127


03-21 191


03-21 190

启动文件修改 在windows环境下,tomcat下的~/bin/catalina.bat文件,在文件头部加入: set "JAVA_OPTS=%JAVA_OPTS% -server -Xms5120m -Xmx10240m -XX:PermSize=640M -XX:MaxPermSize=2560m" 在linux环境下,tomcat下的~/bin/catalina.sh文件,在文件头部加入: JAVA_OPTS recommend-item-box type_blog clearfix" data-url="https://blog.csdn.net/qq_45037155/article/details/123631971" data-report-view='","dist_request_id":"1647929926076_03099","ab_strategy":"paycolumn","index":"17","strategy":"2~default~BLOGTAG~Rate","dest":"https://blog.csdn.net/qq_45037155/article/details/123631971">'>


03-21 189

Читайте также: