我想将所有文件和文件夹从一个目录移动到其子文件夹之一。我该怎么做?
我正在使用 BusyBox 和 Linux。
前任:
将所有文件和文件夹移动/my/path/
到/my/path/subfolder/.
复制,然后删除的解决方案是不可接受的。
谢谢。
答案1
mv * subfolder
当然,将“子文件夹”目录移动到其自身中会失败,但其他所有内容都会移动
答案2
使用*
(通过 shell 扩展)的解决方案无法处理 中的太多对象/my/path/
。在这种情况下,您将得到:
argument list too long
这种方法不使用*
:
cd /my/path/ &&
find . -mindepth 1 -maxdepth 1 ! -name subfolder -exec mv -t subfolder/ {} +
不幸的是-mindepth
和-maxdepth
的选项find
不符合 POSIX 标准;我认为-t
的选项都不符合。mv
该变体应满足 POSIX:
cd /my/path/ &&
find . ! -name . -prune ! -name subfolder -exec mv {} subfolder/ \;
(我改编了这个 Unix 和 Linux SE 答案)。遗憾的是,它mv
会对找到的每个对象进行调用,因此速度很慢。
快速替代方法,只要您可以重新创建目录(最初不存在/my/path/subfolder/
也不/my/subfolder/
应该存在):
- 重命名
path/
为subfolder/
, - 重新创建
path/
, - 搬进。
subfolder/
path/
注意,在基于 inode 的文件系统上,无论有多少个对象,这都应该同样快path/
。代码:
cd /my/ &&
test ! -e subfolder/ && mv path/ subfolder/ &&
mkdir path/ &&
mv subfolder/ path/
在这种情况下,我&&
多次强调如果任何步骤失败,程序应该中止。但是,如果您需要path/
或subfolder/
拥有非默认权限、所有权等,这种方法就不方便了。
答案3
最简单的方法是:
mv !(subfolder) subfolder
'!' 表示“不”,类似于编程语言,其中 mv 会将除子文件夹之外的所有文件和文件夹移动到所需的子文件夹中。
这里描述了诸如移动隐藏文件夹和点文件夹之类的其他内容:https://askubuntu.com/questions/91740/how-to-move-all-files-in-current-folder-to-subfolder
答案4
您可能想查看该mv
命令。您可以尝试搜索目录中的所有文件和文件夹并排除子目录,然后使用find
该mv
命令将找到的所有内容复制到该子目录中。
请参阅类似的 stack-overflow 问题https://stackoverflow.com/questions/4612157/how-to-use-mv-command-to-move-files-except-those-in-a-specific-directory