The*_*ash 8 linux unix bash cron
我刚开始使用 BASH,所以我可以将一个目录的所有内容移动到另一个目录。但问题是,我期待它合并目录。我正在使用 cron 作业来运行此脚本。
#!/bin/bash
shopt -s dotglob nullglob
mv mv_schedule/* public_html/
Run Code Online (Sandbox Code Playgroud)
来源:(/mv_schedule/包含文件夹/文件)
/files/
4.html
5.html
/assets/
sitemap.xml
Run Code Online (Sandbox Code Playgroud)
目的地:(/public_html/以前的文件夹已经存在)
/files/
1.html
2.html
3.html
/assets/
sitemap.xml
Run Code Online (Sandbox Code Playgroud)
所以,我想要的东西,是所有来自这些目录内的新文件/mv_schedule/与在那些合并/public_html/,并已经在那里存在的文件,与那些来自何处来代替/mv_schedule/。
当我使用当前脚本尝试此操作时,它当前正在通过电子邮件返回此错误:
mv: cannot move `mv_schedule/assets' to `public_html/assets': Directory not empty
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
错误消息告诉您的是它无法 mv 资产目录,因为其中有文件。mv a directory 意思是制作一个副本,然后擦除它,它无法擦除它,因为它仍然包含一些文件。这意味着您也应该 mv 资产内的文件,甚至资产内的子目录和文件(如果存在)。但是发出的 mv 命令只能复制(和擦除)存在于 mv_schedule 目录中的内容,而不是存在于 mv_schedule 中的子目录(如资产)中的内容。
你想要的是一个命令,它将目录树下降到最后一个叶子并复制它,类似于 rm、chmod、chown 中的 -r 或 -R 选项。但是, mv 没有这样的选项,因此您必须使用 find 命令,它从您指定的根目录开始下降整个目录树,然后执行您指定的操作。在您的情况下,合适的命令是:
SOURCE_DIR=$1
TARGET_DIR=$2
find $SOURCE_DIR -name '*' -type f -exec mv -f {} $TARGET_DIR \;
Run Code Online (Sandbox Code Playgroud)
这会将所有文件堆积到一个目标目录中。它假定您将源目录和目标目录作为输入行参数传递给 bash 脚本。-f 选项可防止在覆盖时要求确认,您可以将其更改为 -n(不覆盖)或 -i(覆盖前询问)。
相反,如果您希望保留目录结构,请记住命令 cp 确实具有使目录树下降的能力,因此您可以使用该目录树,后跟 rm,因为该命令也具有下降树的能力。一组可能的命令是:
SOURCE_DIR=$1
TARGET_DIR=$2
cp -a $SOURCE_DIR $TARGET_DIR
rm -rf $SOURCE_DIR
Run Code Online (Sandbox Code Playgroud)
注意 cp 中的 -a 选项:它保留时间戳和所有权。如果你不关心这些事情,你可以使用 -R 代替。
Unix 部分对此问题有更一般的讨论。
您可以使用cp-l命令的选项,该选项在同一文件系统上创建文件的硬链接而不是完整数据副本。以下命令将该文件夹复制到父文件夹 ( ),该文件夹已包含具有该名称的目录。source/folderdestinationfolder
cp -rl source/folder destination
rm -r source/folder
Run Code Online (Sandbox Code Playgroud)
笔记:
-P( --no-dereference- 不要取消引用符号链接) 或-a( --archive- 保留所有元数据,还包括-P选项),具体取决于您的需要。-l因此,此方法比 cp (sans ) 或基于 rsync 的解决方案快得多。| 归档时间: |
|
| 查看次数: |
14795 次 |
| 最近记录: |