Shell 为什么不能用find和zip压缩所有文件?

Shell 为什么不能用find和zip压缩所有文件?,shell,find,zip,xargs,Shell,Find,Zip,Xargs,我有以下文件夹结构 . ├── 5.avi ├── a │   ├── 1.avi │   ├── b │   │   └── 2.avi │   └── c │   └── 3.avi └── b ├── 4.avi ├── l └── s 我正在使用以下命令压缩所有avi文件: find . -iname *avi | xargs zip videos.zip 问题是find仅返回5.avi,但如果5.avi不存在,find将返回其余文件 如何解决该问题

我有以下文件夹结构

.
├── 5.avi
├── a
│   ├── 1.avi
│   ├── b
│   │   └── 2.avi
│   └── c
│       └── 3.avi
└── b
    ├── 4.avi
    ├── l
    └── s
我正在使用以下命令压缩所有
avi
文件:

find .  -iname *avi | xargs zip videos.zip
问题是
find
仅返回
5.avi
,但如果
5.avi
不存在,
find
将返回其余文件


如何解决该问题并压缩所有
avi
文件?

shell在将参数传递给命令之前展开星号(
*
)(
在您的情况下查找
)。实际命令如下所示

find-稻谷5.avi
您可以通过将
echo
预先添加到您的命令来测试这一点,例如:

echo-find-在南*阿维
您要做的是按原样向命令传递
*avi
。为此,您必须将星号放在引号中,或者用反斜杠将其转义。您的命令应该是:

find-iname'*.avi'| xargs zip videos.zip

shell在将参数传递给命令之前展开星号(
*
)(
find
)。实际命令如下所示

find-稻谷5.avi
您可以通过将
echo
预先添加到您的命令来测试这一点,例如:

echo-find-在南*阿维
您要做的是按原样向命令传递
*avi
。为此,您必须将星号放在引号中,或者用反斜杠将其转义。您的命令应该是:

find-iname'*.avi'| xargs zip videos.zip

回答得不错。进一步阐述:当shell尝试扩展一个模式而没有匹配项时,默认行为是该模式保持一字不差地作为字符串(测试:
echo 5*6*
)。这个行为可以通过
nullglob
shell设置(
help shopt
)很好的答案来控制。进一步阐述:当shell尝试扩展一个模式而没有匹配项时,默认行为是该模式保持一字不差地作为字符串(测试:
echo 5*6*
)。此行为可以通过
nullglob
shell设置(
help shopt
)进行控制