首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从各个文件夹获取所有文件,并以唯一的名称复制它们

从各个文件夹获取所有文件,并以唯一的名称复制它们
EN

Stack Overflow用户
提问于 2015-02-14 16:29:18
回答 3查看 1.2K关注 0票数 5

当前使用此命令从我的电视文件夹中获取所有的“扇”,并将其转储到一个文件夹中。

代码语言:javascript
复制
find /volume1/tv/ -type f \( -name '*fanart.jpg'* -o -path '*/fanart/*.jpg' -o -path '*/extrafanart/*.jpg' \) -exec cp {} /volume1/tv/_FANART \;

问题是:许多这些文件都有相同的名称,不能转储到同一个文件夹中。示例:

  • 文件夹A
    • fanart.jpg

  • 文件夹B
    • fanart.jpg

是否有方法从它们各自的文件夹中复制这些文件,并在目标文件夹中给它们一个唯一的名称?名字不一定是描述性的,随机就可以了。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2015-02-14 18:41:13

代码语言:javascript
复制
find /volume1/tv/ -type f \( -name '*fanart.jpg'* -o -path '*/fanart/*.jpg' -o -path '*/extrafanart/*.jpg' \) -exec cp --backup=numbered  {} /volume1/tv/_FANART \;

。。

代码语言:javascript
复制
cp --backup=numbered  {}

如果文件存在,这将不会覆盖,而是使用指定的号码进行备份。

文件会被藏起来。查看隐藏文件的Ctrl+H

票数 2
EN

Stack Overflow用户

发布于 2015-02-14 16:54:48

您可以复制这些文件,同时根据它们在原始目录树中的位置给它们命名。例如(":“是合法的,但在文件名中不常见),您的"find”命令可以调用shell脚本(而不是直接调用"cp“),它可能如下所示:

代码语言:javascript
复制
#!/bin/sh
case "x$1" in
x/volume1/tv/_FANART/*)
    ;;
*)
    target=`echo "$1" | sed -e 's,^/volume1/tv/,,' -e s,/,:,g`
    cp "$1" "$2/$target"
    ;;
esac

相应的"-exec“应该是

代码语言:javascript
复制
-exec myscript "{}" /volume1/tv/_FANART \;

顺便说一句,原始示例中的源/目标位于同一个目录树“/volume1 1/tv”中,这就是为什么示例脚本使用case语句来排除已复制到_FANART文件夹的文件。

票数 1
EN

Stack Overflow用户

发布于 2015-02-14 19:32:39

如果要使用md5sum作为新名称:

代码语言:javascript
复制
find /volume1/tv/ -type d -path '/volume1/tv/_FANART' -prune -o -type f \( -name '*fanart.jpg'* -o -path '*/fanart/*.jpg' -o -path '*/extrafanart/*.jpg' \) -exec sh -c 'md5=$(md5sum < "$0") && md5=${md5%% *}.jpg && echo cp "$0" "/volume1/tv/_FANART/$md5"' {} \;

每一件事都发生在sh命令中(所有命令都由&&分隔,但为了清楚起见,我省略了&& ):

代码语言:javascript
复制
md5=$(md5sum < "$0")
md5=${md5%% *}.jpg
cp "$0" "/volume1/tv/_FANART/$md5"'

$0展开为已处理的文件名。我们首先计算文件的md5sum,然后只保留md5sum (md5sum将连字符放在哈希旁边)并将.jpg附加到该文件,最后将文件复制到目标文件夹中,并使用计算的名称。

Notes.

  • 我加了 -type d -path‘/volume1 1/tv/_FANART-prune -o to your command to omit this folder, since you very likely don't want to process it; it would actually be weird to process it, as its content is changed throughoutfind`’s遍历。
  • 我在命令中留下了一个echo,所以绝对不会复制任何东西(实际上,它是100%安全的,您可以将它复制并粘贴到您的终端中):它只显示将要执行的命令(您还将看到它有多快/多慢)。
  • 对于带有空格、换行符、全局等有趣的文件名,该命令是100%安全的。
  • 我使用的是md5sum < file而不是md5sum file,因为如果文件名file包含特殊字符(如反斜杠、换行符等),则md5sum (至少是我的版本)在哈希前面加上一个反斜杠。真奇怪。如果不给文件名,我们就安全了,这不会发生的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28517651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档