我正在编写一个 bash 脚本来将名为“folder”的文件夹复制/移动到已包含“folder”的目录,并且我希望合并内容。
我正在尝试使用这个问题的解决方案:
cp -rl source/folder destination
rm -r source/folder
如果我在终端中输入第一行,源“文件夹”和目标“文件夹”将按预期合并。
但是,当我运行其中包含该行的脚本时,目标现在包含两个文件夹,而不是合并文件夹; “文件夹”和“空白”,其中“空白”包含源“文件夹”的内容。
答案1
将 SOURCE 附加到 DESTINATION 成为 SOUCE+DESTINATION 更复杂(对于自己),请查找
man append
您可以尝试:
cp --recursive --preserve --update SOURCE DESTINATION
使用“--preserve”保留指定的属性(默认:模式、所有权、时间戳),如果可能的话附加属性:上下文、链接、xattr、全部
使用“--recursive”递归复制目录
当源文件比目标文件新或目标文件丢失时,使用“--update”进行复制。
如需终端帮助:
cp --help
或者
man cp
当终端工作时,在 bash 脚本中尝试一下
。
答案2
我认为更好的方法是使用更好的工具。
rsync -avhP --remove-source-files "source/folder" destination
-a
用于归档(保持用户/组、模式等完好无损)
-v
只是为了冗长,这样你就可以观察它在做什么
-h
因为我喜欢人类可读的信息
-P
所以 rsync 将接收部分传输,以防万一
--remove-source-files
将删除 rsync 传输的所有内容
我发现我经常不得不将空文件夹删除作为内务处理:
find source/folder -type d -exec rmdir {} \;
我将其添加到前面zsh
,repeat 10
它会清除 10 层深的空文件夹。 :-)