使用unix脚本显示&逐个删除记录

时间:2015-02-15 13:06:17

标签: linux bash shell unix awk

我坚持我的一个要求。我要编写一个小的unix脚本来从我的文件系统中删除一些文件。 它应该进入/ myDir目录并选择大小为GB的所有子目录和子子目录。 然后使用for循环逐个进入这些目录,然后显示&使用另一个for循环删除早于2014年11月30日的文件。

我写了一个小脚本(仅显示可能性),但它在myDir下显示错误的记录,而不是我想要的记录。 它也没有在脚本中使用echo命令显示任何内容。可能是我以错误的方式使用awk命令。

这是我的剧本:

for dir in `du -kh * |grep 'G' |awk '{print $2}'`; do     
    cd /myDir/$dir
    for file in `ls -al blk_* | awk '$6 == "Nov" && $7 <= 30 {print $9}'`; do
        echo "$file";
    done
done

任何帮助都会有很大的帮助。

2 个答案:

答案 0 :(得分:4)

解析ls绝不是可行的方法。我认为find更适合这项任务:

touch -d 2014-11-30 dummy
find -type f -maxdepth 1 -name 'blk_*' \! -newer dummy -delete 
rm dummy

这将创建一个虚拟文件,其时间戳为2014年11月30日。它在当前目录中搜索以blk_开头的任何早于虚拟文件的文件并将其删除。我假设您尝试的-a ls参数只是从其他地方复制而来,因为它没有任何有用的用途。

根据您的find版本,您可以直接进行比较,使用-newermt开关指定gniourf_gniourf建议的日期:

find -type f -maxdepth 1 -name 'blk_*' \! -newermt '2014-11-30' -delete

您可以将这些命令放在外部循环中,或者如果您愿意,可以替换整个脚本并将-maxdepth更改为2(如果还有其他文件,也可以添加-mindepth避免在mydir中匹配。 find还允许您匹配大于特定大小的文件,因此您可以根据需要添加该文件。

答案 1 :(得分:1)

你可以这样找到这个

查看适合您条件的所有文件

find . -type f -size +1G  -newermt "2014-11-01" ! -newermt "2014-11-30" -ls

...

-type f find all files 
-size +1G that has a size of 1G or more
-newermt "2014-11-01" ! -newermt "2014-11-30" the files must be in the month of november 2014
-ls put them in ls format

要删除所有文件,可以修改上面的命令行以阅读

   find . -type f -size +1G  -newermt "2014-11-01" ! -newermt "2014-11-30" -exec sh -c 'echo deleting {};rm -f  "{}"' \;

以下命令行中的这一部分将删除文件并显示正在删除的文件名

-exec sh -c 'echo deleting {};rm -f  "{}"' \; this will remove all files and display a message of the file being deleted.