我有 2 个目录“../in/”和“../temp/”。我的问题是如何编写 bash 脚本以将最旧的文件或目录保留在同一个 ../in/ 目录中,并移动剩余的文件或目录到 ../temp/ 目录。
答案1
如果可以假设文件名中没有空格或换行符,则可以使用更简单的方法来执行此操作。在现代世界中,人们不能假设这一点,此外,编写如此脆弱的脚本是一种不好的形式,以至于如果找到这样的合法文件名,脚本就会失败。
为了安全起见,请使用以下命令(可能需要 GNU 工具):
find ../ini/ -type f -printf '%T@ %p\0' | sort -nz | sed -Ezn '2,$s/[^ ]* //p' | xargs --null mv -t ../temp/
这会将除最旧文件之外的所有文件../ini/
移至../temp/
.
怎么运行的
find ../ini/ -type f
这会找到目录中的所有常规文件
../ini
。-printf '%T@ %p\0'
这会打印在以 null 分隔的字符串中找到的文件的时间戳和名称。
sort -nz
这对以 null 分隔的字符串进行数字排序。完成此操作后,最旧的文件将首先列出。
sed -Ezn '2,$s/[^ ]* //p'
这将打印除第一个文件之外的所有文件名。它还删除了时间戳。
xargs --null mv -t ../temp/
这会对
mv
这些文件执行命令,将它们发送到../temp/
目录。
使用不支持 NULL 分隔项的工具
上述假设的工具支持\0
单独的项目。现代版本的 Linux (GNU) 确实支持这一点。当使用不支持的操作系统时,有多种解决方法。以下使用换行符分隔的项目,因此应该与旧工具兼容:
find ../ini/ -type f -printf '%T@ %p\n' | sort -n | sed -En '2,$s/[^ ]* //p' | xargs -d'\n' mv -t ../temp/
如果任何文件的名称包含换行符,此操作将会失败。