在Linux上递归移动文件和文件夹


75

考虑:

ls -al ../public-back
drwxrwxr-x  4 apache   apache     4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x  2 apache   apache    4096 Apr 19 03:33 content
drwxrwxr-x  2 apache   apache   20480 Apr 20 06:14 images
drwxrwxr-x  2 apache   apache    4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x  4 apache   apache     4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 content
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 images
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 video

如何将/public-back/templates具有权限的递归内容移动到/public/templates


mv ../public-back/templates/* public / templates /

mv -R ../public-back/templates/* public/templates/我仍然会投票解决这个问题。

2
mv:无效选项– R @Vladislav Zorov

3
我做了cp -a ../public-back/templates/ public /

Answers:


92

除非我对这个问题有误解,否则它将起作用:

mv /public-back/templates/* /public/templates

另外,除非您有大量的文件列表,否则添加操作-i会在覆盖任何内容之前询问,这在使用通配符(如)时会增加安全性*


14
这不会移动隐藏文件。
阿尔达2014年

2
有关设置dotglob的信息,请参见askubuntu.com/a/259386/358964,以便隐藏文件也将被移动。
mkobit

3
注意:这不会覆盖子目录中的文件。您会收到一条Directory not empty消息。
阿姆斯特朗(Armstrongest)

似乎它使目录层次结构扁平化。没有为我保留原始文件夹中的文件夹。所有文件最终都位于同一文件夹中,而不是从字面上移动具有相同结构的原始文件夹。
罗伯特·诺亚克

此解决方案有效,但是如果您看到此错误:mv: target '/public/templates' is not a directory只需手动创建目标文件夹:mkdir /public/templates
阿里·沙伯

8

cp的手册页指出:

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

尝试;

cp -rp /public-back/templates/* /public/templates/

13
mv移动的cp而是复制的 –语义/词源上的区别。
Marius Butuc

cp比慢mvcp强制计算机将所有内容从磁盘复制到RAM,然后再次将其写入磁盘,这可能需要很长时间,具体取决于文件的大小。但是,mv由于只需要重写链接,因此总是立即发生。
tjespe

4

将项目从拇指驱动器移至OSMC系统时,我发现以下内容非常有用:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

下面说明其工作方式。

顺便说一句,不要忘记在源或目标目录名称中的任何空格之前添加反斜杠(请参见上文)。

find  finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the shell will expand it before find sees it.

-exec     Executes a command, in our case mv

-v        Verbose, so you can see what's happening (optional)

{}        is replaced by the name of the found object.

实际上,您正在查找所有文件和所有文件夹,然后逐个移动它们(或者,如果首先找到目录,则在移动该目录及其中的内容)。这将为每次移动启动一个新过程,并且效率很低。仅当常规命令失败时才使用它。


2

mv似乎不这样做。但是您可以使用这个小技巧,就像一个魅力:

tar cf - . |(cd /targetdir; tar xvf -)

并保留权限和所有权限。

注意:以上都不适合我,这就是解决方法的原因。


1
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

因此,请在目标目录中创建硬链接并删除源目录。'mv'在您的情况下根本不起作用,并且通常仅在源dir和dest没有公共子树时才起作用。

请注意,我假设问题中的“移动”一词意味着在操作之后应该删除源目录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.