如何递归复制并将文件名更改为唯一

如何递归复制并将文件名更改为唯一

我有一棵大树,在外部驱动器上包含大量照片,该驱动器使用一种 Linux 文件系统类型(不记得是哪一种)进行格式化。它安装在我的 Mac 上,我正在尝试复制照片,但看起来有名为“somePic.jpg”和“somePic.JPG”的文件。当我尝试复制它们时,OSX 抱怨名称重复并退出。如何在确保文件名唯一的情况下复制它们?我不能先重命名源树上的任何重复项,因为 OSX 将驱动器安装为只读。

我用 cp、gcp、sed 和 xargs 玩了几个小时,但无法让任何东西工作。

答案1

...根据你的对问题发表评论...

pax -rws'/\.JPG$/.CAP&/' /root/of/copied/tree /dest/path

如果.jpg.JPG是你唯一的问题,那应该可行。

您还可以将print 原语添加到文件名替换中,以获取所有已更改的文件名的列表:

pax -rws'/\.JPG$/.CAP&/p' /root/of/copied/tree /dest/path

据我所知,pax应该已经安装在 OSX 系统上,因此这总体上应该是一个相当无压力的解决方案。

不过,如果问题最终变得更加深刻,那么您可能也会对pax支持……感兴趣。

-i

以交互方式重命名文件或存档成员。对于与模式操作数匹配的每个存档成员或与文件操作数匹配的每个文件,pax将提示/dev/tty提供文件名、文件模式及其修改时间。pax然后将从 读取一行/dev/tty。如果此行为空,则跳过文件或存档成员。如果该行由单个句点组成,则处理文件或存档成员而不修改其名称。否则,其名称将替换为该行的内容。pax如果 EOF 为,将立即以非零退出状态退出( CTRL+D)读取响应时遇到的问题或者/dev/tty无法打开进行读写操作。

答案2

这是一个简短的刺探:

# for f in $( find yoursourcedirectory -name \*.jpg ) ; do cp ${f} yourtargetdirectory/${f}.CAP1.jpg ; done

然后

# for f in $( find yoursourcedirectory -name \*.JPG ) ; do cp ${f} yourtargetdirectory/${f}.CAP2.jpg ; done

这将获取源中名为 *.jpg 的所有文件,并将它们复制为 *.CAP1.jpg,将所有 *.JPG 文件复制为 *.CAP2.jpg

另一种方法是使用 diffmerge: https://sourcegear.com/diffmerge/

还有一个(如果有很多很多文件尝试使用相同的名称)是为每个文件分配一个随机名称:

# for f in $( find yoursourcedirectory -iname \*.JPG ) ; do cp ${f} yourtargetdirectory/$(dd if=/dev/random count=20 2>&1 /dev/null |md5).jpg ; done

(请注意,-iname 开关使搜索不区分大小写,因此 *.JPG 和 *.jpg 都会被找到)

相关内容