删除除Linux中最新文件之外的所有.csv文件

时间:2016-03-17 18:01:45

标签: linux shell find

我正在尝试删除名为Date_Sources的目录中的文件。该目录中有5个子文件夹,名为Test1 Test2 ... Test5

我知道如何每90天删除一次文件:

find /home/deployer/Data_Sources/.../..   -mtime +90 -type f -exec rm -r '{}' \; 

如何确保我的脚本在90天后删除所有文件除了最新文件(每个子目录)?

因此脚本必须转到Date_Sources/Test1Data_sources/Test2,...等,并确保除了最新的文件以外90天后删除所有文件。

1 个答案:

答案 0 :(得分:3)

类似的东西:

find /home/deployer/Data_Sources -maxdepth 1 -mindepth 1 -type d > afile
while IFS= read -r subdir
do
  find "$subdir" -mtime +90 -type f -printf "%T+\t%p\n" \
      | sort \
      | head -n-1 \
      | sed 's|[[:blank:]]\+| |' \
      | cut -f 2 -d " " > bfile
  while IFS= read -r each
  do
    rm -vf "$each"
  done < bfile
done < afile
rm -f bfile afile

说明:

查找直接目录(/home/deployer/Data_Sources)中-maxdepth 1内的所有目录并排除其自身(-mindepth 1),并将其转储到名为afile

的文件中
find /home/deployer/Data_Sources -maxdepth 1 -mindepth 1 -type d > afile

afile读取每一行并存储在环境变量subdir中(请参阅此循环的done行,以查看afile是否通过管道传输到{{1} }} loop)

while

在每个while IFS= read -r subdir do 上运行find命令,仅列出超过90天的文件(并打印文件的时间戳)

subdir

find "$subdir" -mtime +90 -type f -printf "%T+\t%p\n" \ sort

的输出
find

抓取除 | sort \ 输出的最后一行之外的所有行(最后一行是最新文件)

sort

将所有多个空格替换为单个空格

      | head -n-1 \

从输出中获取第二列,将空格定义为分隔符;全部转储到名为 | sed 's|[[:blank:]]\+| |' \ 的文件中。 (可能以某种方式使用选项卡作为分隔符而不使用上面的bfile,但我不确定如何指定它以便它可以工作; sed肯定没有做到这一点)< / p>

-d "\t"

现在,逐行阅读 | cut -f 2 -d " " > bfile 并存储在bfile环境变量中(再次:查看完成行以显示管道中的each

bfile

实际上是删除旧文件(冗长和抑制提示)

  while IFS= read -r each
  do

删除临时文件 rm -vf "$each" done < bfile done < afile bfile

afile

注意:

- 更新以删除使用rm -f bfile afile 循环以正确处理路径中的特殊字符和空格;还有变量的双引号(由@ mklement0建议)