目前使用此命令从我的电视文件夹中获取所有“fanart”,并将其转储到一个文件夹中。
find /volume1/tv/ -type f \( -name '*fanart.jpg'* -o -path '*/fanart/*.jpg' -o -path '*/extrafanart/*.jpg' \) -exec cp {} /volume1/tv/_FANART \;
这是问题:很多这些文件具有相同的名称,并且无法转储到同一文件夹中。例如:
有没有办法从各自的文件夹中复制这些文件,并在目标文件夹中为它们指定唯一的名称?名称不必是任何描述性的,随机的就好了。
谢谢!
答案 0 :(得分:2)
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
查看隐藏文件
答案 1 :(得分:1)
您可以根据文件在原始目录树中的位置复制文件,同时为其指定名称。例如(“:”是合法的但是 在文件名中不常见),你的“查找”命令可以调用一个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 / tv”中,这就是示例脚本使用case语句的原因 - 排除已复制到_FANART文件夹的文件。 / p>
答案 2 :(得分:1)
如果要将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
附加到那个,最后我们将文件复制到目标文件夹中,计算出的名字。
备注强>
我添加了
-type d -path '/volume1/tv/_FANART` -prune -o
命令省略此文件夹,因为您很可能不想处理它;处理它实际上很奇怪,因为它的内容在整个find
的遍历中都会发生变化。
echo
,因此绝对没有任何内容被复制(因为它是100%安全的,你只需将其复制并粘贴到终端中):它只显示了什么命令将被执行(你也会看到它有多快/慢)。md5sum < file
而非md5sum file
,因为如果文件名file
包含特殊字符(如反斜杠,换行符等),md5sum
(至少我的版本) )用反斜杠预先设置哈希值。奇怪的。如果不提供文件名,我们就安全了,这不会发生。