我坚持我的一个要求。我要编写一个小的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
任何帮助都会有很大的帮助。
答案 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.