如何递归复制文件,重命名它们但在Bash中保留相同的扩展名?

时间:2014-12-17 01:36:18

标签: bash find cp

我有一个包含数万种不同文件类型的文件夹。我想将它们全部复制到一个新文件夹(Copy1),但也将它们全部重命名为$ RANDOM,但保持扩展名完整。我意识到我可以编写一行来指定要查找的扩展名以及如何命名它,但是必须有一种方法可以动态地执行它,因为至少有100种文件类型,将来可能更多。

到目前为止,我有以下内容:

find ./ -name '*.*' -type f -exec bash -c 'cp "$1" "${1/\/123_//_$RANDOM}"' -- {} \;

但是在扩展后放置随机数,并且它将all放在同一个文件夹中。我无法弄清楚如何做以下两件事:

1 - 保持所有路径不变,但保留在新的根文件夹(Copy1)

2 - 如何将名称设为$ RANDOM.extension,而不是.extension。$ RANDOM

PS - $ RANDOM我的意思是实际随机生成的数字。我对保留文件夹结构很感兴趣,所以我们每个目录最多处理几百个文件,但是所有目录/文件都需要重命名为$ RANDOM。另一种看待我需要做什么的方法。将包含所有子目录和文件的所有内容或Folder1复制到Folder2(其中Fodler2是$ RANDOM名称),然后将所有文件夹和文件重命名为随机名称,但保留所有扩展名。

编辑:好的,我想出了如何重命名和保持扩展。但我有一个问题,它将所有文件转储到运行脚本的根目录。如何将它们保存在各自的文件夹中?我使用的命令是:

find ./ -name '*.*' -type f -exec bash -c 'mv "$1" $RANDOM.${1##*.}' -- {} \;

谢谢!

3 个答案:

答案 0 :(得分:0)

这是我想出的:

i=1
random="whatever"
find . -name "*.*" -type f | while read f
do
    newbase=${f/*./$random$i.} //added counter to filename
    cp $f /Path/Name/"$newbase"
    ((i++))
done

我必须为random(i)添加一个计数器,否则,如果扩展名相似,则复制时文件会自动覆盖。

在新文件夹中,您的文件应如下所示:

whatever1.txt
whatever2.txt
etc etc

我希望这就是你要找的东西。

答案 1 :(得分:0)

  

好的,我想出了如何重命名和保持扩展。但我有一个   将所有文件转储到根目录的问题   从哪里运行脚本。我如何将它们保持在各自的位置   文件夹?我使用的命令是:

find ./ -name '*.*' -type f -exec bash -c 'mv "$1" $RANDOM.${1##*.}' -- {} \;

将您的命令更改为:

PATH=/bin:/usr/bin find . -name '*.*' -type f -execdir bash -c 'mv "$1" $RANDOM.${1##*.}' -- {} \;

答案 2 :(得分:0)

这是对我有用的命令。

find . -name '*.pdf' -type f -exec bash -c 'echo "{}" && cp "$1" ./$RANDOM.${1##*.}' -- {} \;