将大量文件和目录移动到不同的目录

Mar*_*k D 3 bash shell-script recursive rename

我正在尝试将以下结构中存在的大量文件移动到 /mnt/originals 但我需要同时维护该结构。我知道 cp 将是一个解决方案,但由于空间限制不能使用 cp 。

/mnt/originals-us/4
/mnt/originals.us/4/0b9
/mnt/originals.us/4/0b8
/mnt/originals.us/4/0b4
/mnt/originals.us/4/0b3
/mnt/originals.us/4/0b9/a62/
/mnt/originals.us/4/0b9/a47/
/mnt/originals.us/4/0b9/f0f/
/mnt/originals.us/4/0b9/a62/aa5/file16.png
/mnt/originals.us/4/0b9/a62/ba1/file1.png
/mnt/originals.us/4/0b9/a47/31f/file3.mov
/mnt/originals.us/4/0b9/f0f/
.
.
.
Run Code Online (Sandbox Code Playgroud)

等等。它是一组相当大的不同文件名和类型的文件。我尝试了以下但没有奏效。

mv /mnt/originals-us/ /mnt/originals/ 
Run Code Online (Sandbox Code Playgroud)

但得到以下

mv: inter-device move failed: `/mnt/originals-us/10/0b9/' to `/mnt/originals/10/0b9'; unable to remove target: Is a directory
Run Code Online (Sandbox Code Playgroud)

我也想过写一个大规模的 chanin-ed 命令,但我认为这也行不通。

这是我到目前为止。

find . -type f -print | rev | cut -d '/' -f1 | rev
Run Code Online (Sandbox Code Playgroud)

这显然给了我所有的文件名,但我如何将它与第一部分链接起来?

Dav*_*ins 6

一种选择是将 rsync 与 --remove-source-files

rsync -vr --remove-source-files /mnt/originals-us/ /mnt/originals/
Run Code Online (Sandbox Code Playgroud)

潜在警告:我不知道 rsync 在执行潜在破坏性操作之前如何检查空间。在完美的世界中,rsync 会计算需要多少空间,检查它是否可用,然后中止并警告用户或(如果空间足够)执行操作。

编辑:我-r错误地省略了递归选项 ( ),感谢 OP 的提及,现在已修复

  • @MarkD 我推荐 `-a`(保留所有内容),其中包括 `-r` 以及保留权限、时间戳、特殊文件等。 (2认同)