![将文件夹中的所有文件复制到另一个文件夹并附加 .到文件名并将其重命名回原始文件名](https://linux22.com/image/165979/%E5%B0%86%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E5%B9%B6%E9%99%84%E5%8A%A0%20.%E5%88%B0%E6%96%87%E4%BB%B6%E5%90%8D%E5%B9%B6%E5%B0%86%E5%85%B6%E9%87%8D%E5%91%BD%E5%90%8D%E5%9B%9E%E5%8E%9F%E5%A7%8B%E6%96%87%E4%BB%B6%E5%90%8D.png)
经过搜索和尝试各种方法后我无法让它工作。
我需要将大量文件(超过 10 万个文件)复制到另一个文件夹,并在文件名开头附加点。
例子:
/foo/bar/filename1.txt
到/foo2/bar/.filename1.txt
- 然后将其重命名回原来的名称
/foo2/bar/filename.txt
为什么我需要这样做是因为我有一个应用程序将继续扫描/foo2/bar
文件夹并忽略那些文件名前面带有点的文件,这样它就不会处理那些正在复制的文件。这主要是因为这 2 个文件夹可以位于 2 个不同的网络驱动器或某些已安装的设备中。
我不能简单地使用 mv 或 cp 因为我有一些文件夹包含太多文件,它只会抛出参数列表太长错误,因此我一直在尝试使用 find 命令但无济于事。
尝试使用不同的命令:
find /foo/bar/ -type f -exec cp -t /foo2/bar {} +
和
find /foo/bar/ -type f -exec mv {} /foo2/bar/.{} \;
我知道上面的命令不会做我想要的事情,这就是我已经厌倦的事情。
感谢任何可以提供帮助的人...
答案1
rsync -a -T tmpdir /foo/bar/ /foo2/bar
(请注意,/
末尾的/foo/bar/
很重要。)
该实用程序将在将文件移动到 下的正确名称之前rsync
写入文件。例如,您可以使用下面的隐藏目录来存储传输中的文件:tmpdir
/foo2/bar
/foo2/bar
mkdir -p /foo2/bar/.tmp
rsync -a -T /foo2/bar/.tmp /foo/bar/ /foo2/bar
另请参阅rsync
手册,尤其是有关该选项的部分-T
。
上述命令将递归/foo/bar
复制到/foo2/bar
.要禁用递归性,请使用rsync -a --no-recursive ...
(该-a
选项启用递归以及文件元数据同步,并--no-recursion
仅关闭 的递归方面-a
)。