压缩一个月的文件

时间:2013-08-13 11:17:48

标签: linux bash

如果文件数量超过限制,我已经编写了一个脚本来将一组文件压缩成一个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

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

3 个答案:

答案 0 :(得分: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=("$@")

答案 1 :(得分: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,我找不到一个明确的方法来计算文件数,你可能想要做一些研究,以便找到一次。

答案 2 :(得分: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进行比较,但是它与您的示例中的相同。

请注意,这仅适用于所有文件位于同一目录中的情况!