获取各种文件夹中的所有文件并使用唯一名称复制它们

时间:2015-02-14 16:29:18

标签: linux bash

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

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

有没有办法从各自的文件夹中复制这些文件,并在目标文件夹中为它们指定唯一的名称?名称不必是任何描述性的,随机的就好了。

谢谢!

3 个答案:

答案 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%安全的,你只需将其复制并粘贴到终端中):它只显示了什么命令将被执行(你也会看到它有多快/慢)。
  • 该命令对于包含空格,换行符,全局等的有趣文件名是100%安全的。
  • 我使用md5sum < file而非md5sum file,因为如果文件名file包含特殊字符(如反斜杠,换行符等),md5sum(至少我的版本) )用反斜杠预先设置哈希值。奇怪的。如果不提供文件名,我们就安全了,这不会发生。