Bash脚本 - 保留每天的最后修改文件(Mac OSX)

时间:2016-05-18 08:08:24

标签: bash macos

我有一个包含文件的文件夹。我想编写一个脚本,删除除了每天最后修改过的文件之外的所有文件。 例如:如果我有这个文件夹:

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

4 个答案:

答案 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()