Ubuntu 12.04 LTS 64 位。
我正在尝试执行计划任务,将包含数千个文件的目录复制到 Samba 共享(同时跳过重复项)。我通过 GUI 映射了 Samba 共享。
我尝试过的命令:
cp /home/security/Brick/* ~/.gvfs/“atm-bak-01.local/Brick 上的摄像头”-n
我找到了这个,但我不知道如何将语法更改为我需要的。
查找 -maxdepth 1 -name'*.prj'-exec mv -t../prjshp{}+
如能提供任何提示我将不胜感激。
答案1
问题是 shell 会/home/security/Brick/*
用一长串(太长)的文件列表来扩展你的前将其传递给cp
。
如果你想复制所有Brick
目录也许最直接的事情是:
cp -rn /home/security/Brick ~/.gvfs/"cam on atm-bak-01.local"/
使用“递归”标志cp
。这也会复制 Brick 下的所有结构(包括子目录)。
一种可能性是使用for
循环:
for file in /home/security/Brick/*;
do
cp -n $file ~/.gvfs/"cam on atm-bak-01.local/Brick"
done
或者使用查找:
find /home/security/Brick/ -type f -exec cp -n {} ~/.gvfs/"cam on atm-bak-01.local/Brick" \;
在这个命令中,-type f
表示仅选择文件(没有目录),然后对每个文件执行指定的命令:{}
用文件名替换,\;
是关闭子句所需的分号-exec
,否则 shell 将对其进行转义(并删除)。
后面的命令-exec
可以是任何你想要的(例如,cp -n
你可以使用cp -av
来以存档模式复制(包括时间戳和适当性)并覆盖,或者你可以使用其他命令(但:你应该先了解 shell 转义、通配符和引号,否则你可能会造成很大的危害 --- 例如参见“学习 shell”)。
Find 是一个非常强大的命令 --- 值得好好学习。我发现了一些有趣的教程这里,这里和这里。
关于使用以下方式进行备份cp -n
:
请注意,该-n
标志不会覆盖现有文件,因此如果您对之前复制的本地目录中的文件进行更改,它将不是再次复制...您将在备份中获得它的旧版本。
因此,我建议使用备份或同步实用程序,例如齐奏或者同步来完成这项工作。这些实用程序只会更新已更改的文件,可以最大限度地减少写入(以及网络带宽),并且通常更安全。rsync
只需说一句:
rsync -azvv /home/security/Brick ~/.gvfs/"cam on atm-bak-01.local/Brick"
(注意不要在末尾添加“/”---否则 rsync 将创建子目录 Brick/Brick。是的,rsync
功能强大,有时还相当不稳定。)
Unison 有一个很好的图形界面,还会告诉您存储库中是否存在冲突的变化 --- 所以这是我的首选选项。