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

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

考虑:

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

答案1

除非我误解了这个问题,否则这将有效:

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

此外,除非您有大量的文件,否则-i在覆盖任何内容之前都会进行询问,这在使用通配符(如)时会增加一些安全性*

答案2

cp 的手册页指出:

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

尝试;

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

答案3

当将项目从我的拇指驱动器移动到我的 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.

实际上,您是在查找所有文件和所有文件夹并逐个移动它们(或者,如果先找到某个目录,则移动该目录及其内容)。这会为每次移动启动一个新进程,效率非常低。仅当常规命令失败时才使用此方法。

答案4

mv 似乎无法做到这一点。但是您可以使用这个小技巧,效果非常好:

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

并保留权限和所有内容。

注意:以上方法都不适用于我,所以才采用这种解决方法。

相关内容