Отсутствует аргумент Exec linux
Обновлено: 21.11.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
Читайте также: