xUr Asked: 2019-07-14 15:05:45 +0800 CST2019-07-14 15:05:45 +0800 CST 2019-07-14 15:05:45 +0800 CST 查找带有变量的命令 772 我想做这个:readarray var1 < <(find "/path/to/dir" \( $var2 \) | sort) echo $var2 user@domain:~# -name "*.avi" -o -name "*.mkv" 不幸的是,我的脚本不起作用。请告诉我我在哪里做错了。 bash shell 2 个回答 Voted Best Answer steeldriver 2019-07-14T15:22:43+08:002019-07-14T15:22:43+08:00 使用数组: var2=( -name "*.avi" -o -name "*.mkv" ) readarray var1 < <(find "/path/to/dir" \( "${var2[@]}" \) | sort) 请参阅有些相关的我们如何运行存储在变量中的命令? Kusalananda 2019-07-14T22:42:39+08:002019-07-14T22:42:39+08:00 要将路径下的所有名称/path/to/dir作为排序列表获取bash: shopt -s globstar nullglob dotglob names=( /path/to/dir/** ) 中的globstarshell 选项bash启用了**glob 的使用,它的工作方式与路径名中的*匹配但匹配/(即,它“递归”匹配到目录中)。nullglobshell 选项使得如果 shell glob 不匹配任何名称,它会被完全删除(默认是保留未扩展的模式)。该dotglob选项默认匹配隐藏文件名。 shell glob 的扩展结果是按字典顺序排列的,就像 的默认输出一样sort,因此不需要名称管道sort。 要获取具有文件名后缀.avi或的名称.mkv,请使用 shopt -s globstar nullglob dotglob extglob names=( /path/to/dir/**/*.@(avi|mkv) ) 在这里,我添加了extglobshell 选项,它允许使用扩展的通配模式。该模式的@(avi|mkv)意思是“要么avi或mkv”,所以完整的模式将匹配下面/path/to/dir以要么.avi或结尾的任何名称.mkv。结果数组将被排序。 find如果您需要对找到的名称进行操作,或者如果您需要合并特定的文件类型测试,这将很有用。例如,如果您需要确保只匹配常规文件,请使用 find /path/to/dir -type f \( -name '*.avi' -o -name '*.mkv' \) 给定两个文件名后缀avi和mkv一个名为 的数组suffix,-name测试可以构造为一个数组: suffix=( avi mkv ) nametest=( -false ) # assumes GNU find here for suf in "${suffix[@]}"; do nametest+=( -o -name ".$suf" ) done find /path/to/dir -type f \( "${nametest[@]}" \) 当您实际上想要对找到的名称执行操作时,将输出保存在变量中几乎是不正确的。相反,用于执行操作:find-exec find /path/to/dir -type f \( "${nametest[@]}" \) -exec sh -c ' for pathname do # do something with "$pathname" here done' sh {} + 如需进一步阅读,请参阅 了解 `find` 的 -exec 选项 为什么循环查找的输出是不好的做法? 关于在本网站上找到的许多其他问题和答案。
使用数组:
请参阅有些相关的我们如何运行存储在变量中的命令?
要将路径下的所有名称
/path/to/dir
作为排序列表获取bash
:中的
globstar
shell 选项bash
启用了**
glob 的使用,它的工作方式与路径名中的*
匹配但匹配/
(即,它“递归”匹配到目录中)。nullglob
shell 选项使得如果 shell glob 不匹配任何名称,它会被完全删除(默认是保留未扩展的模式)。该dotglob
选项默认匹配隐藏文件名。shell glob 的扩展结果是按字典顺序排列的,就像 的默认输出一样
sort
,因此不需要名称管道sort
。要获取具有文件名后缀
.avi
或的名称.mkv
,请使用在这里,我添加了
extglob
shell 选项,它允许使用扩展的通配模式。该模式的@(avi|mkv)
意思是“要么avi
或mkv
”,所以完整的模式将匹配下面/path/to/dir
以要么.avi
或结尾的任何名称.mkv
。结果数组将被排序。find
如果您需要对找到的名称进行操作,或者如果您需要合并特定的文件类型测试,这将很有用。例如,如果您需要确保只匹配常规文件,请使用给定两个文件名后缀
avi
和mkv
一个名为 的数组suffix
,-name
测试可以构造为一个数组:当您实际上想要对找到的名称执行操作时,将输出保存在变量中几乎是不正确的。相反,用于执行操作:
find
-exec
如需进一步阅读,请参阅