如何在文件夹中仅保留最新文件并将较旧的文件移动到存档位置

如何在文件夹中仅保留最新文件并将较旧的文件移动到存档位置

在我的文件夹中,有多个类似的文件:

ContractAdjustments.CHRS201804202144.txt
ContractAdjustments.CHRS201804212144.txt
ContractAdjustments.CHRS201804222144.txt
ContractAdjustments.CHRS201804232144.txt

我只想保留最新的文件并将其余文件移动到存档位置。我正在使用以下脚本,这给了我一个错误:

$ find -maxdepth 1 -type f -iname 'ContractAdjustments.*.TXT' -printf '%T@|%p\n' | sort -r -n | tail -n +2 | cut -d'|' -f2 | xargs -i mv {} ARCHV

答案1

#!/bin/sh

mkdir -p ARCHIVE || exit 1

newest=
for file in ContractAdjustments.*.txt; do
    if [ -f "$file" ]; then
        if [ -z "$newest" ]; then
            # this is the first file, initialize "newest"
            newest=$file
        elif [ "$file" -nt "$newest" ]; then
            # file is newer than "newest",
            # archive "newest" and set new newest file
            mv -i "$newest" ARCHIVE
            newest="$file"
        else
            # file is older, archive it
            mv -i "$file" ARCHIVE
        fi
    fi
done

if [ -n "$newest" ]; then
    printf 'Done. Newest file = %s\n' "$newest"
else
    echo 'No files found'
fi

如果在其内置命令中/bin/sh实现测试,该脚本会将所有旧文件移动到一个文件夹,同时保持最新文件不变。-nt[ARCHIVE

它通过迭代与给定模式匹配的文件名来实现这一点,对于每个文件,根据迄今为止找到的最新文件测试其时间戳,并根据文件是较新还是较旧来移动文件。

该脚本正确地处理保留文件名中的任何空格字符等。在这种特殊情况下,这可能不是问题,但一般来说,Unix 文件名可能包含空格和嵌入的换行符,以及文件名通配符。


如果你想顺便去文件名排序而不是按文件上的时间戳进行排序:

#!/bin/sh

mkdir -p ARCHIVE || exit 1

set -- ContractAdjustments.*.txt

while [ "$#" -gt 1 ]; do
    mv -i "$1" ARCHIVE
    shift
done

printf 'Done. Newest file = %s\n' "$1"

这会将位置参数( 、 等)设置$1$2与给定模式匹配的文件列表。然后,当列表中仍然有多个文件时,将列表中的第一个文件移动到目录ARCHIVE并将其从列表中移出。列表中的最后一个文件是根据文件名排在最后的文件(该文件保留在原处)。

答案2

一个简单的方法是:

mv `ls -t ContractAdjustments.*.txt | awk '{ iteration+=1; if (iteration > 1) { print } } ' ` ARCHV

当然,这会在边缘条件下产生错误(例如,如果目录中只有一个文件),但它始终有效。

答案3

将除第一个文件之外的每个文件的列表放入变量中,并对其运行 for 循环。

 listinmemory=`ls -alht | tail -n +5 | awk '{print $9}'`; for each in $listinmemory; do mv $each /path/to/directory; done

ls -alht将列出您不想运行任何内容的 4 行,

total 123K
drwxr-xr-x.  5 user user 1.0K Jun 27 09:20 .
drwx------. 13 user user 2.0K Jun 27 10:36 ..
-rw-rw-r--.  1 user user 3.0K Jun  6 18:29 file1 

最近的文件和 3 行——然后是您执行的所有文件,因此tail -n +5将跳过前 4 行并运行mv $each /path/to/directory它找到的所有文件!

答案4

ls在您的情况下,将 so解析cd到目录中并执行以下操作并不是一个好主意:

 for CA in $(find . -maxdepth 1 -type f -name ContractAdjustments\*.txt | head --lines=-1); do mv $CA /path/to/archive/; done

使用for带有命令替换的循环,查找目录中以您指定的格式开头的所有文件ContractAdjustments*.txt,并根据第二个八位字节的日期按从旧到最新的顺序列出它们。然后通过管道将--head --lines=-1其打印除最后一行之外的所有内容(最新文件)并将值传递给变量CA(对于 ContractAdjustments)。最后,do用于mv将除最新文件之外的所有文件移动到存档位置。

相关内容