我有一个包含文件的文件夹。我想编写一个脚本,删除除了每天最后修改过的文件之外的所有文件。 例如:如果我有这个文件夹:
Uriels-MacBook-Pro-3:demo urielfrankel$ ls -la
total 304
drwxr-xr-x 36 urielfrankel staff 1224 Apr 10 17:35 .
drwxr-xr-x 3 urielfrankel staff 102 Apr 10 17:45 ..
-rw-r--r-- 1 urielfrankel staff 2483 Apr 10 17:55 ApiClientAsyncTask.java
-rw-r--r-- 1 urielfrankel staff 5258 Apr 11 12:35 BaseDemoActivity.java
-rw-r--r-- 1 urielfrankel staff 2157 Apr 11 13:35 CreateEmptyFileActivity.java
-rw-r--r-- 1 urielfrankel staff 3753 Apr 9 16:35 CreateFileActivity.java
-rw-r--r-- 1 urielfrankel staff 2756 Apr 9 17:35 CreateFileInAppFolderActivity.java
-rw-r--r-- 1 urielfrankel staff 3376 Apr 8 10:35 CreateFileInFolderActivity.java
-rw-r--r-- 1 urielfrankel staff 3302 Apr 8 11:35 CreateFileWithCreatorActivity.java
-rw-r--r-- 1 urielfrankel staff 1864 Apr 8 12:35 CreateFolderActivity.java
执行脚本后,它将如下所示:
Uriels-MacBook-Pro-3:demo urielfrankel$ ls -la
total 105
drwxr-xr-x 36 urielfrankel staff 1224 Apr 10 17:35 .
drwxr-xr-x 3 urielfrankel staff 102 Apr 10 17:45 ..
-rw-r--r-- 1 urielfrankel staff 2483 Apr 10 17:55 ApiClientAsyncTask.java
-rw-r--r-- 1 urielfrankel staff 2157 Apr 11 13:35 CreateEmptyFileActivity.java
-rw-r--r-- 1 urielfrankel staff 2756 Apr 9 17:35 CreateFileInAppFolderActivity.java
-rw-r--r-- 1 urielfrankel staff 1864 Apr 8 12:35 CreateFolderActivity.java
答案 0 :(得分:1)
for day in $(ls -lap --time-style full-iso | grep -v / | awk '{print $6}' | sort | uniq ); do ls -lap --time-style full-iso | grep -v / | grep "$day" | awk '{print $7"\t"$9}' | sort -r | sed '1d' | awk '{print $2}' | xargs rm -f; done
这将仅列出当前目录中的文件,并使用全iso格式(低至纳秒)打印其修改日期,找到唯一的日期并删除除了每天最后修改的文件之外的所有文件而不询问(rm -f,所以要小心。)
这条线存在一些缺陷:
答案 1 :(得分:1)
从Gunstick的答案中借用find
命令的某些部分。这是一个真正空间安全的解决方案并删除文件。 谨慎使用。最好将文件复制到另一个目录并首先从那里运行。
find . -type f -printf "%TY%Tm%Td|%Ts|%f\n" |\
sort -t'|' -k1n -k2nr |\
awk -F'|' '(a[$1]){print $3} {a[$1]++}' |\
xargs -I{} rm -f {}
此代码在Ubuntu Linux上进行了测试。
我不知道你为什么要这样做。我自己会考虑一个基于git的解决方案。
答案 2 :(得分:0)
这列出了文件,它不会删除它们 这个应该是空间安全的,但不是特殊的字符安全。
find . -maxdepth 1 -type f -printf "%TY%Tm%Td %Ts %f\n" |
sort -k1n -k2nr|
awk 'a[$1]++{ # increment day's counter, if it was 0: print line
sub("^[0-9]* *[0-9]* *","") # remove timestamp stuff
print
}'
%TY给出时间戳的年份
月份%Tm
%td当天
%Ts是每天正确订单的unix时间戳
然后列表按天排序,按时间戳排序,awk打印出每天的第一个文件名。 未对第一个文件进行彻底测试。
答案 3 :(得分:0)
谢谢大家,最后我在同事的帮助下亲自做到了。
frame.pack()