我有一个便携式磁盘,内容如下:
/media/usb1/CBCradio3/1.wav
/media/usb1/CBCradio3/2.wav
/media/usb1/CBCradio3/3.wav
/media/usb1/CBCradio3/4.wav
/media/usb1/podcasts/1.wav
/media/usb1/podcasts/2.wav
/media/usb1/podcasts/3.wav
还有一个硬盘,内容如下:
/home/user/Music/CBCradio3/2.wav
/home/user/Music/CBCradio3/3.wav
/home/user/Music/radio12/1.wav
/home/user/Music/radio12/2.wav
我想复制数据,但是,如果里面的文件夹名称/Music/
已经存在,它应该忽略它。
换句话说,我不希望文件夹最终包含混合数据。如果我使用常规副本来复制驱动器,我最终会得到如下内容:
/home/user/Music/CBCradio3/1.wav <--added to folder
/home/user/Music/CBCradio3/2.wav
/home/user/Music/CBCradio3/3.wav
/home/user/Music/CBCradio3/4.wav <--added to folder
/home/user/Music/podcasts/1.wav <--added whole folder
/home/user/Music/podcasts/2.wav <--added whole folder
/home/user/Music/podcasts/3.wav <--added whole folder
/home/user/Music/radio12/1.wav
/home/user/Music/radio12/2.wav
但我不希望它合并内容,如果文件夹存在,它应该跳过复制内容。我怎样才能实现这个目标?
- 我尝试复制
mc
,thunar
但它合并了文件夹内容。 - 以下目录
.../usb1/
不包含更多子目录。
答案1
根据您的描述,这不是一个递归问题:如果foo
源和目标中都存在,则foo
不会被复制,故事结束。因此,一个简单的 shell 循环就可以解决这个问题。
source=/media/usb1
destination=/home/user/Music
test -d "$destination" || mkdir -- "$destination"
for x in "$source"/*; do
if ! [ -e "$destination/$x" ]; then
cp -Rdp "$x" "$destination/"
fi
done
(但请注意,该要求是有问题的。例如,如果复制被中断,您最终将在目标中得到部分目录,并且无法恢复,甚至无法知道有什么需要恢复。)
答案2
有时,如果您需要在复制(或不复制)某些文件之前先查看一下以选择/取消选择某些文件,那么使用 rsync 或其他工具不是很方便
因此,您可能需要使用文本控制台“图形”工具,该工具将显示两个目录并允许您比较它们的内容,并允许“同步”它们。
举个例子:https://en.wikipedia.org/wiki/Double_Commander
它具有许多功能,包括您可能想尝试的功能:
目录比较:目录(全部或仅选定的)可以对称(双向)和非对称(单向)进行比较和同步。此功能按目录和子目录显示两个位置之间的差异,并且可以对已添加、更改或删除的文件进行全自动备份。
作为纯文本(在终端内)界面的变体将是旧的,但直到今年仍在更新:MC,又名https://en.wikipedia.org/wiki/Midnight_Commander。这https://en.wikipedia.org/wiki/Comparison_of_file_managers表明它还可以:现在同步目录。强烈建议尝试一下,因为只需按键即可移动,这使得它变得轻而易举。
当然,这些工具使中断和稍后重新启动变得非常容易,因为下一次比较将是新鲜的。