查找:从文件而不是从 cli 运行时缺少 -exec 的参数
find: missing argument to -exec when run from file but not from cli
我有一个看起来像这样的文件
#!/bin/bash
find . -type f -exec chmod 644 {} \;
find . -type f -exec chown vagrant:www-data {} \;
find . -type d -exec chmod 755 {} \;
find . -type d -exec chown vagrant:www-data {} \;
我们假设它叫做 foo.sh
我在 Ubuntu 14.04 机器上,在我执行它之前我有 root 权限 sudo su
。
如果我调用 sh foo.sh
,命令行会告诉我:
# sh foo.sh
: not foundh: 2: foo.sh:
find: missing argument to `-exec'
find: missing argument to `-exec'
find: missing argument to `-exec'
find: missing argument to `-exec'
: not foundh: 7: foo.sh:
但是当我直接从命令行依次运行 4 个命令时,它就可以工作了。问题是:怎么了?为什么它抱怨第 2 行和第 7 行(它们是空的)
谢谢 (:
感谢 @fejese 的帮助,我设法修复了它。
问题是文件有 Windows/DOS 行结尾。不知道为什么,也许我在我的 windows 机器上打开过一次。更重要的是它是如何发生的,我该如何修复它。
首先找出使用的文件后缀。因此我们可以使用命令行:
file foo.sh
如果输出如下:
foo.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
如果你有 CRLF line terminators
东西,那么你必须用 dos2unix
程序修复它。
sudo apt-get install dos2unix
dos2unix foo.sh
file foo.sh
如果你还没有安装 dos2unix,你只需要 运行 apt-get 的东西(第一行)。
现在它应该看起来像这样:
foo.sh: Bourne-Again shell script, ASCII text executable
现在您可以 运行 使用
没有任何问题
sh foo.sh
有关文件、dos2unix 和 unix2dos 的进一步阅读,您可以在此处找到:View line-endings in a text file
作为安装 dos2unix
的替代方法:
sed -i -e "s/\r//g" foo.sh
此命令就地替换文件中的所有 \r
个字符。
我有一个看起来像这样的文件
#!/bin/bash
find . -type f -exec chmod 644 {} \;
find . -type f -exec chown vagrant:www-data {} \;
find . -type d -exec chmod 755 {} \;
find . -type d -exec chown vagrant:www-data {} \;
我们假设它叫做 foo.sh
我在 Ubuntu 14.04 机器上,在我执行它之前我有 root 权限 sudo su
。
如果我调用 sh foo.sh
,命令行会告诉我:
# sh foo.sh
: not foundh: 2: foo.sh:
find: missing argument to `-exec'
find: missing argument to `-exec'
find: missing argument to `-exec'
find: missing argument to `-exec'
: not foundh: 7: foo.sh:
但是当我直接从命令行依次运行 4 个命令时,它就可以工作了。问题是:怎么了?为什么它抱怨第 2 行和第 7 行(它们是空的)
谢谢 (:
感谢 @fejese 的帮助,我设法修复了它。
问题是文件有 Windows/DOS 行结尾。不知道为什么,也许我在我的 windows 机器上打开过一次。更重要的是它是如何发生的,我该如何修复它。
首先找出使用的文件后缀。因此我们可以使用命令行:
file foo.sh
如果输出如下:
foo.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
如果你有 CRLF line terminators
东西,那么你必须用 dos2unix
程序修复它。
sudo apt-get install dos2unix
dos2unix foo.sh
file foo.sh
如果你还没有安装 dos2unix,你只需要 运行 apt-get 的东西(第一行)。 现在它应该看起来像这样:
foo.sh: Bourne-Again shell script, ASCII text executable
现在您可以 运行 使用
没有任何问题sh foo.sh
有关文件、dos2unix 和 unix2dos 的进一步阅读,您可以在此处找到:View line-endings in a text file
作为安装 dos2unix
的替代方法:
sed -i -e "s/\r//g" foo.sh
此命令就地替换文件中的所有 \r
个字符。