当前使用此命令从我的电视文件夹中获取所有的“扇”,并将其转储到一个文件夹中。
find /volume1/tv/ -type f \( -name '*fanart.jpg'* -o -path '*/fanart/*.jpg' -o -path '*/extrafanart/*.jpg' \) -exec cp {} /volume1/tv/_FANART \;问题是:许多这些文件都有相同的名称,不能转储到同一个文件夹中。示例:
是否有方法从它们各自的文件夹中复制这些文件,并在目标文件夹中给它们一个唯一的名称?名字不一定是描述性的,随机就可以了。
谢谢!
发布于 2015-02-14 18:41:13
find /volume1/tv/ -type f \( -name '*fanart.jpg'* -o -path '*/fanart/*.jpg' -o -path '*/extrafanart/*.jpg' \) -exec cp --backup=numbered {} /volume1/tv/_FANART \;。。
cp --backup=numbered {}如果文件存在,这将不会覆盖,而是使用指定的号码进行备份。
文件会被藏起来。查看隐藏文件的Ctrl+H
发布于 2015-02-14 16:54:48
您可以复制这些文件,同时根据它们在原始目录树中的位置给它们命名。例如(":“是合法的,但在文件名中不常见),您的"find”命令可以调用shell脚本(而不是直接调用"cp“),它可能如下所示:
#!/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“应该是
-exec myscript "{}" /volume1/tv/_FANART \;顺便说一句,原始示例中的源/目标位于同一个目录树“/volume1 1/tv”中,这就是为什么示例脚本使用case语句来排除已复制到_FANART文件夹的文件。
发布于 2015-02-14 19:32:39
如果要使用md5sum作为新名称:
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命令中(所有命令都由&&分隔,但为了清楚起见,我省略了&& ):
md5=$(md5sum < "$0")
md5=${md5%% *}.jpg
cp "$0" "/volume1/tv/_FANART/$md5"'$0展开为已处理的文件名。我们首先计算文件的md5sum,然后只保留md5sum (md5sum将连字符放在哈希旁边)并将.jpg附加到该文件,最后将文件复制到目标文件夹中,并使用计算的名称。
Notes.
-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%安全的,您可以将它复制并粘贴到您的终端中):它只显示将要执行的命令(您还将看到它有多快/多慢)。md5sum < file而不是md5sum file,因为如果文件名file包含特殊字符(如反斜杠、换行符等),则md5sum (至少是我的版本)在哈希前面加上一个反斜杠。真奇怪。如果不给文件名,我们就安全了,这不会发生的。https://stackoverflow.com/questions/28517651
复制相似问题