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
)进行控制