假设我想使用命令递归解压缩${file}*.zip
某个目录中具有模式的文件/home/A/XML
find
find /home/A/XML -type f -name "${file}*.zip" -exec unzip '{}' -d /target/path \;
现在,我想解析目录列表而不是仅仅/home/A/XML
for dir in "${path}"; do
find "${dir}" -name "${file}*\.zip" -type f -exec unzip '{}' -d "${dir}"/"${file}" \;
done
我尝试使用for
循环来解析目录,但解压缩在第一个目录之后停止,这意味着它执行与前面的代码相同的操作,它仅在目录中解压缩/home/A/XML
。
caution: not extracting; -d ignored
对于其余目录,我收到了上述错误。有人可以指导我吗?提前致谢。
答案1
如果该目录列表以换行符分隔(每行一个)存储在标量变量中$path
(这不是一个好的变量名称,因为它在多个 shell 中很特殊,但不是bash
),您可以这样做:
IFS=$'\n' # split on newline
set -o noglob # disable glob
for dir in $path # invoke the split+glob operator ($path unquoted)
do
find "$dir" -name "$file*.zip" -type f -exec unzip -d "$dir/$file" {} \;
done
如果$path
是一个bash
数组,而不是像 中那样path=(dir1 dir2...)
,则将循环更改为
for dir in "${path[@]}"
如果使用 GNU find
,您可能需要-quit
在末尾添加谓词或find
命令以允许unzip
每个目录仅成功一个,除非您希望将所有zip
文件合并到同一目录中。
请注意,选项应放在非选项参数之前。