用于查找和删除文件夹名称为日期格式的文件夹的 Unix 命令

用于查找和删除文件夹名称为日期格式的文件夹的 Unix 命令

我的文件夹名称采用以下日期格式

20130801
20130802
20130803
20130804
20130805
20130806
20130807
20130808
.
.
.
20130819

同样,我为过去两年的每一天创建了文件夹,每个文件夹中都有一些文件。

我正在尝试找到一个 unix 命令,它可以搜索周六和周日创建的文件夹并删除文件夹中的所有内容以及文件夹本身。

比如我上面提到的日期,带有名称2013080320130804内容的文件夹应该被删除。

答案1

您可以使用日期函数来识别周末:

find . -path "./2013*" -printf "%f\n" | \
awk '{ \
cmd = sprintf( "date -d %s +\"%a\"", $0 ); \
cmd | getline value; close( cmd ); \
if( value ~ /Sat/ || value ~ /Sun/ ) print $0; \
}'

所有这些实际上都在一行上,但可以放在一行上。不过,我使用了“\”来使其更具可读性。您可以删除“\”,并从 shell 中将它们全部放在一行上。

这将从 find 输出中输出与“Sat”或“Sun”(特定于语言环境)相对应的目录名称。您可以使用输出创建一个脚本来“rm -r”目录。

如果您知道所有目录的更新日期都与其名称相匹配,您也可以直接使用 find 的日期格式“%Aa”(它由与 date 相同的 strftime 格式解析支持)。我认为情况并非如此(因为它不适合我的测试)。

例如我为了测试而创建的目录:

find . -path "./2013*" -printf "%Aa\n"

产量

Tue
Tue
Tue

这没什么用。

答案2

您可以创建一个 bash 脚本(a.bash)来执行此操作:

#!/bin/bash

for i in $(\ls -1d 2013*); 
  do 
     if [ $(date -d "$i" +%a) == "Sun" ] || [ $(date -d "$i" +%a) == "Sat" ]; then 
          echo "$i is weekend. Delete the content";
          rm -rf "$i"/*; 
     fi; 
done

执行./a.bash

相关内容