我有这个脚本来循环遍历所有文件夹并移动超过 2 年的文件。我使用安装命令,因为它会在目标路径上创建必要的目录,然后删除源。我想更改脚本以使用该命令,mv
因为它比复制文件然后删除它要快得多。但我不知道如何在没有文件名的情况下获取路径以传递给命令mkdir -p
?我应该如何修改脚本?
for d in *; do
find "$d" -type f -mtime +730 -exec sh -c '
echo "moving $d/{}" &&
install -Dp "/data/Customer Files$d/{}" "/data/Customer Files Over 2 Years Old$d/{}" &&
rm -f "/data/Customer Files$d/{}"' \;
done
答案1
但你需要dirname
注意,如果你给它一个目录名,它会给你到父目录的路径,也许一个例子更简单:
$ 目录名 /usr/bin/bash
/usr/bin$ 目录名 /usr/bin
/usr
回到你的脚本,当你搜索文件时,dirname 的微妙之处不起作用。我也会简化它一点,我不喜欢 subshell,没有它对我来说更容易解析。它变成:
#!/bin/bash
SRC=./src
DST=./dst
for f in `cd $SRC && find . -type f -mtime +730`; do
echo "moving $f"
mkdir -p "$DST/`dirname $f`"
mv "$SRC/$f" "$DST/$f"
done
显然,您必须根据需要设置 SRC / DST。
顺便说一句,当您使用相同的文件系统时,mv
它比cp
+更快。rm