用于压缩文件列表的Shell脚本

时间:2014-08-16 03:23:34

标签: bash shell cygwin 7zip

我实际上正在使用cygwin64。我想在目录中压缩一些选定的文件。比如,目录myDir中的3个最旧的文件。要获取3个最旧的文件,我就是这样做的:

$ ls myDir -t | tail -3
file1
file2
file3

现在,问题是,如何将这3个文件(名称)传递给tar7z

这是我尝试过的:

7z a myFile.7z (ls myDir -t | tail -3)

但这不起作用 - bash抱怨(。删除它没有帮助,也没有在--之后添加myFile.7z。同样适用于tar而不是7z

4 个答案:

答案 0 :(得分:2)

在ls / tail命令后使用带有7z或tar的xargs。我现在没有测试linux终端但下面应该可以工作 - >

ls myDir -t | tail -3 | xargs 7z a myFile.7z 

更新 - >要解决路径问题,这是最终解决方案。

ls -t -d -1 $PWD/myDir/* | tail -3 | xargs 7z a myFile.7z

答案 1 :(得分:1)

请尝试使用此表单:

dir='myDir'
readarray -t files < <(exec ls "$dir" -t1 | tail -3)
7z a myFile.7z "${files[@]/#/$dir/}"
  • -1使文件名逐行枚举
  • readarray读取数组

  • "${files[@]/#/$dir/}"在每个文件名上插入dir路径

也尝试这个脚本:

#!/bin/bash

FILE=$1
DIR=$2

if [[ $FILE != *.7z ]]; then
    echo "Invalid filename for 7z archive: $FILE"
    echo "Usage: $0 filename.7z dir"
    exit 1
elif [[ ! -d $DIR ]]; then
    echo "Not a directory: $DIR"
    echo "Usage: $0 filename.7z dir"
    exit 1
fi

[[ $FILE != /* ]] && FILE=$PWD/$1

cd "$DIR" || {
    echo "Unable to change directory to $DIR."
    exit 1
}

readarray -t TARGETS < <(exec ls -t1)

7za a "$FILE" "${TARGETS[@]:(-3)}"

将其保存在script.sh等文件中,然后使用bash script.sh myFile.7z myDir运行。

另一种方式:

( cd myDir; 7za a ../myFile.7z $(ls -t1 | tail -3); )

或者

( cd myDir; ls -t1 | tail -3 | xargs -d '\n' -- 7za a ../myFile.7z; )

答案 2 :(得分:0)

我没有使用7z,但我认为您在$之前错过了()

7z a myFile.7z $(ls myDir -t | tail -3)

您可以输入以下命令检查命令:

echo $(ls -t *.txt | head -3)

答案 3 :(得分:0)

迭代ls输出can be unreliable

以下是使用stat完成所需内容的一种方式。

declare -A files
for file in myDir/*; do
    modified=$(stat -c "%Y" "$file")
    files["$modified"]="$file"
done
top_3_indices=$(for i in ${!files[@]}; do echo $i; done | sort -rn | head -n 3)
for i in ${top_3_indices[@]}; do
    7z a myFile.7z "${files[$i]}"
done
相关问题