0

如果文件数量超过限制,我已经编写了一个脚本来将一组文件压缩到一个 zip 文件中。

    limit=1000                        #limit the number of files

files=( /mnt/md0/capture/dcn/*.pcap)     #file format to be zipped  

if((${#files[0]}>limit )); then   #if number of files above limit
zip -j /mnt/md0/capture/dcn/capture_zip-$(date "+%b_%d_%Y_%H_%M_%S").zip /mnt/md0/capture/dcn/*.pcap 

fi

我需要修改它,以便脚本检查上个月的文件数量,而不是整个文件集。我该如何实现

4

3 回答 3

2

这个脚本也许。

#!/bin/bash

[ -n "$BASH_VERSION" ] || {
    echo "You need Bash to run this script."
    exit 1
}

shopt -s extglob || {
    echo "Unable to enable extglob option."
    exit 1
}

LIMIT=1000
FILES=(/mnt/md0/capture/dcn/*.pcap)
ONE_MONTH_BEFORE=0
ONE_MONTH_OLD_FILES=()

read ONE_MONTH_BEFORE < <(date -d 'TODAY - 1 month' '+%s') && [[ $ONE_MONTH_BEFORE == +([[:digit:]]) && ONE_MONTH_BEFORE -gt 0 ]] || {
    echo "Unable to get timestamp one month before current day."
    exit 1
}

for F in "${FILES[@]}"; do
    read TIMESTAMP < <(date -r "$F" '+%s') && [[ $TIMESTAMP == +([[:digit:]]) && TIMESTAMP -le ONE_MONTH_BEFORE ]] && ONE_MONTH_OLD_FILES+=("$F")
done

if [[ ${#ONE_MONTH_OLD_FILES[@]} -gt LIMIT ]]; then
    # echo "Zipping ${FILES[*]}."  ## Just an example message you can create.
    zip -j "/mnt/md0/capture/dcn/capture_zip-$(date '+%b_%d_%Y_%H_%M_%S').zip" "${ONE_MONTH_OLD_FILES[@]}"
fi

确保以 unix 文件格式保存并运行bash script.sh.

您还可以修改脚本以通过参数获取文件,而不是通过:

FILES=("$@")
于 2013-08-13T11:39:26.757 回答
1

完整更新:

#!/bin/bash
#Limit of your choice
LIMIT=1000
#Get the number of files, that has `*.txt` in its name, with last modified time 30 days ago
NUMBER=$(find /yourdirectory -maxdepth 1 -name "*.pcap" -mtime +30 | wc -l)
if [[ $NUMBER -gt $LIMIT ]]
then
  FILES=$(find /yourdirectory -maxdepth 1 -name "*.pcap" -mtime +30)
  zip archive.zip $FILES
fi

我两次获取文件的原因是因为 bash 数组是由空格分隔的,而不是\n,而且我找不到明确的方法来计算文件的数量,您可能需要对此进行一些研究以找到一次。

于 2013-08-13T11:52:10.503 回答
0

只需将您的if行替换为

if [[ "$(find $(dirname "$files") -maxdepth 1 -wholename "$files" -mtime -30 | wc -l)" -gt "$limit" ]]; then

从左到右这个表达式

  • 搜索 ( find)
  • 在您的模式路径中($(dirname "$files")从最后一个“/”中删除所有内容)
  • 但不在其子目录中 ( -maxdepth 1)
  • 对于与您的模式匹配的文件 ( -wholename "$files")
  • 超过 30 天的 ( -mtime -30)
  • 并计算这些文件的数量 ( wc -l)

我更喜欢-gt比较,但其他方面与您的示例相同。

请注意,这仅在您的所有文件都在同一目录中时才有效!

于 2013-08-13T11:41:10.193 回答