删除1个月以前的文件,但每月保留一个文件


3

我尝试编写类似的东西 删除1个月以前的文件,但保留在该月的第1天创建的文件
不同之处在于我每月需要一个文件。

我正在使用我的构建环境的脚本,这不是每天由scm轮询引起的。

我认为实现它的唯一方法是使用find来获取所有“旧”文件并对其执行一些检查。
首先,我将删除列表中的所有文件,这些文件已保存为月份文件。然后我会从列表中删除一个文件作为月份文件,之后我会删除列表中的所有文件。

我错过了查找或类似的功能吗?


文件的创建日期是否在其文件名中? file_2013-07-16.txt 或类似的东西? Linux不存储文件的创建日期(除非你使用的是一些模糊的文件系统),所以除非你在文件名(或某些文件类型特定的元数据,或者数据库)中记录了它们的创建日期,否则你'我们必须根据它们的最后时间来做 编辑 而不是在它们被创建时。
evilsoup

是的,创建日期包含在文件名中。但我们也可以使用修改时间。文件将写入其位置,并且只能以只读方式访问。
CSchulz

文件命名的模式是什么?请将其编辑到您的问题中。任何依赖文件名中包含的东西的答案都需要具有确切的模式才能工作。
evilsoup

我已经广泛更新了我的答案。如果您已阅读第一个版本,则可能需要再次查看。
terdon

Answers:


4

摘要 :最完整的解决方案是最后一个,根据您的具体操作选择最适合您的解决方案。


实际上,如果你想要的是每月保留一个文件,你可以重命名所有文件 month。这将覆盖除每月一个文件以外的所有内容。您没有提供有关文件类型或文件位置的信息。我假设所有文件都在同一目录中,没有子目录。如果这是错误的,请更新您的问题,提供更多详细信息,我会更新我的答案。

for file in *; do 
  month=$(date -d `stat -c %y $file | cut -f 1 -d ' ' ` +%B);
  mv $file $month;
done 

上面的脚本将为您提供名为的文件 JanuaryFebruary 如果您需要保留原始文件名,可以试试这个:

for file in *; do 
 month=$(date -d `stat -c %y $file | cut -f 1 -d ' ' ` +%B); 
 rm *.$month; 
 mv $file $file.$month; 
done

这将留下您调用的文件 <FILENAME>.<MONTH>, 例如 foo.January


上述两种解决方案都非常简单。一个更通用的解决方案也适用于子目录中的文件并跳过不到一个月的文件:

find . -type f -mtime +29 | while IFS= read -r file; do 
 month=$(date -d `stat -c %y "$file" | cut -f 1 -d ' ' ` +%B); 
 find . -type f -name "*$month" -delete
 mv "$file" "$file.$month"; 
done

笔记:

  • 上面的解决方案将查找当前目录和所有子目录中至少一个月的文件,并且每月只保留一个文件。这意味着,如果您有两个文件在1月份最后一次修改,其中一个是 ./foo 和另外一个 baz/bar,也只保留一个 ./foo.January 要么 baz/bar.January

  • 这假设您没有可以命名的去年的任何文件 foo.January。如果这样做,那些将被删除。


最后,稍微复杂一点,它将让您保持文件的名称不变,并避免上述问题:

tmp=`mktemp -u XXXX`;
find . -type f -mtime +29 | while IFS= read -r file; do 
  date=$(date -d `stat -c %y "$file" | cut -f 1 -d ' ' ` +%B%Y);
  foo=$tmp"_"$date; 
  find . -type f -name "*$foo" -delete
  mv "$file" "$file.$foo"; 
done
find . -type f -name "*$tmp*" | while IFS= read -r file; do 
  mv "$file" "${file%.*}";
done 

说明:

这个脚本使用 mktemp -u XXXX (例如 Xy12 )生成随机字符串,然后与日期组合(例如, January2008 )文件。然后将所有至少一个月(> 29天,对不起二月)旧的文件重命名为 filename.Xy12_January2008。第二个循环查找名称中包含随机字符串的所有文件( Xy12 )并删除他们的扩展,所以 filename.Xy12_January2008filename 再次。

最终结果是每年每个月的一个文件,原始文件名保持不变。该脚本可以处理带空格的文件名,它将在当前目录和所有子目录中查找文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.