bash - for循环中的多个文件
问题描述
我有这个循环遍历目录并查找特定文件(从脚本提示符读取 $path):
for FILE in $path/*/logs/*2016-*; do
######note that I don't have quotes around $path/*/logs/*2016-* in order for parameter expansion to work
JOB=${FILE%/*/*}
JOB_NAME=${JOB##*/}
cd $path/$JOB_NAME/logs
tar zcvf 2016_logs.tgz "$FILE"
done
发生的事情是它压缩每个文件并在每个循环中覆盖 tar 文件,所以我的 tar 存档中只有一个文件。
我需要 $path/*/logs 中的单个 tgz 文件,其中包含该目录中与“2016-”匹配的所有文件
更新:我能够使用以下代码解决我的问题:
for DIR in $path/*/logs ; do
cd $DIR
FILES=$(find ./ -type f -name "*${year}*" -print)
if [[ -n $FILES ]];then
tar -cvzf "${year}_logs.tgz" ${FILES}
fi
done
else
echo "file not found"
fi
解决方案
当前代码在 FILES 上循环,然后将文件的 TGZ 版本放入同一文件夹中的 2016_logs.tgz 中。循环遍历文件夹会更有效,并从各个数据文件构建每个 TGZ 文件。
Bash 解决方案 (shopt)
shopt -s nullglob
for DIR in $path/*/logs ; do
files=$(shopt -s nullglob ; cd $DIR && echo *2016-*)
[ "$files" ] || continue
(cd $DIR && tar cvzf 2016_logs.tgz $files)
done
推荐阅读
- haskell - 在期望 Either 的 fn 或块内绑定或返回 Left
- ios - 2 轴坐标系 bezierpath 中数据点的样条曲线
- security - 如何在无法访问互联网的情况下保护 chrome 扩展程序中的密码?
- r - 使用ggplot2的雷达图中的未闭合线
- multithreading - Python 如何在另一个线程中启动线程?
- javascript - 我可以使用 NightwatchJS 或 Selenium 来验证页面上多个 HTML5 画布内部使用的颜色吗?
- jhipster - Jhipster:处理模型更新和前端更改
- julia - 缺少列时对 vcat 的重大更改
- docker - 带有 Helm Charts 的 Gitlab 多容器 pod
- typescript - Redux Promise Middleware 如何处理 dispatch 的返回类型?