检查子目录是否存在压缩文件——如果不存在则压缩

Checking subdirectories for existence of compressed file -- compressing if does not exist

我正在尝试编写一个脚本来检查子目录是否存在压缩文件,如果文件不存在,则压缩必要的文件。

我已经尝试了两个版本的脚本:

版本 1

for directory in /pool/folder/ID*/; do
    echo "Starting for loop"
    if [ -e /pool/folder/ID*/*.txt.gz ]
    then
        echo "file already exists"
    else
        echo "File does not exist"
        echo "file is being compressed"
        gzip *.txt
    fi
done

这没有用,我认为它与我的 -e 标志有关:http://www.ducea.com/2009/03/05/bash-tips-if-e-wildcard-file-check-too-many-arguments/

一旦我的 "if" 语句开始,终端输出看起来像是在尝试检查我计算机上的每个子目录:

Display all 4854 possibilities? (y or n)

然后它继续列出每个目录。所以我尝试删除我的 -e 标志并使用 ls:

版本 2

for directory in /pool/folder/ID*/; do
    echo "Starting for loop"
    files=$(ls /pool/folder/ID*/*.txt.gz 2> /dev/null | wc -l)
    if [ **"$files" != "0"** ]
    then
        echo "zipped file already exists"
    else
        echo "Zipped file does not exist"
    fi
done

但同样的事情发生了(列出所有目录)。

这就是你想要的吗? 这将进入目录 dir 并检查其中的所有文件。如果文件已经压缩,继续,如果文件没有压缩,压缩它。

for dir in /pool/folder/ID*; do
    [ -d "${dir}" ] || continue
    printf "processing %s\n" "${dir}"
    for file in "${dir}"/*.txt; do
       if [ -f "${file}.gz" ]; then
          printf "%s already compressed\n" "${file}"
       elif [ -f "${file}" ]; then
          printf "%s being compressed\n" "${file}"
          gzip "${file}"
       fi
    done
done

再短一点就是:

for dir in /pool/folder/ID*; do
    [ -d "${dir}" ] || continue
    printf "processing %s\n" "${dir}"
    for file in "${dir}"/*.txt; do
       [ -f "${file}.gz" ] && printf "%s already compressed\n" "${file}" && continue
       [ -f "${file}" ] && printf "%s being compressed\n" "${file}" && gzip "${file}"
    done
done