首页 > 解决方案 > 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

标签: bashfor-looptarparameter-expansion

解决方案


当前代码在 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

推荐阅读