bash - 移动超过 7 天的文件/目录

标签 bash

我有这段代码可以找到超过 7 天的文件/目录,然后执行 mv。但是我意识到我需要一个不同的目录和文件命令。 -type 也不支持 fd - 手册说它只支持一个字符。

find /mnt/third/bt/uploads/ -type f -mtime +7 -exec mv {} /mnt/third/bt/tmp/ \;

如何将文件和目录 >7d 移动到 /mnt/third/bt/tmp/ 中,同时保持它们在 /mnt/third/bt/uploads/中的相同结构?

谢谢

最佳答案

恕我直言,要正确地做到这一点,这是一个非常重要的问题 - 至少对我来说 :)。如果更有经验的人发布更好的解决方案,我会很高兴。

脚本:(必须有一个 GNU 查找,如果您的“查找”是 GNU 版本,请更改 gfind 以查找)

FROMDIR="/mnt/third/bt/uploads"
TODIR="/mnt/third/bt/tmp"
tmp="/tmp/movelist.$$"

cd "$FROMDIR"
gfind . -depth -mtime +7 -printf "%Y %p\n" >$tmp
sed 's/^. //' < $tmp | cpio --quiet -pdm "$TODIR"

while read -r type name
do
    case $type in
    f) rm "$name";;
    d) rmdir "$name";;
    esac
done < $tmp
#rm $tmp

解释:

  • 找到你想要移动的所有内容(先复制然后删除)并将其存储在 tmp 文件中(查找)
  • 将 tmp 文件中的内容列表复制到新位置 (cpio)
  • 最后删除旧文件和目录 - 基于 tmp 文件中的列表(同时...)

该脚本不处理符号链接(symbolic link)、fifo 文件等,并且会在删除目录时打印无数错误是旧的,但它们不是空的(包含新文件或子目录)

先试运行! :)

关于bash - 移动超过 7 天的文件/目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5963859/

相关文章:

bash - 如何使用 sed 或 awk 按模式将字符串拆分为标记

Bash 脚本不断删除文件,直到目录大小小于 X

bash - 控制在 UNIX shell 上运行的后台作业数

bash - bash脚本中点的用法

bash 变量在curl命令中

bash - 监控 xargs 内的进度

bash - 提取点前的子字符串

Linux:如何在运行脚本时自动打开终端

linux - 文件格式 : Confusion using awk NR Variable

json - 如何过滤没有嵌套范围的嵌套 JSON 数据