我目前正在编写一个脚本,该脚本允许我将任何超过 5 天的文件移动到具有相同路径的存档文件夹中,但根文件夹除外,因为根文件夹会发生变化。因此类似于:
root/subdir1/subdir2/file
到rootarchive/subdir1/subdir2/file
。它应该可以递归工作。
我已经尝试为“根”文件夹的所有文件创建一个 foreach:
#!/bin/bash
find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
mv $file ../rootarchive/"$file"
done
但这并没有正常工作,因为我的 mv 命令找不到指定的目的地../rootarchive/"$file"
。你们有人知道如何解决这个问题吗?
答案1
您需要从中创建目录树subdir1/subdir2/
-mv
不会为您执行此操作。例如,您可以执行以下操作:
find . -type f -mtime +5 -print0 | while IFS= read -r -d '' file; do
dir="${file%/*}"
mkdir -p ../rootarchive/"$dir"
mv "$file" ../rootarchive/"$file"
done
你可以rsync
。它可以重新创建目录结构并删除复制的文件:
find . -type f -mtime +5 -print0 |
rsync -0avP --remove-source-files --files-from=- ./ ../rootarchive
为了rsync
:
-0
表示文件列表以空字符分隔。这会影响:--files-from=
读取要复制的文件列表(来自标准输入-
:)。-a
启用存档模式,保留文件权限、所有权等。--remove-source-files
删除已复制的文件成功地从源头。-vP
启用详细模式和进度信息。