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

Dux*_*uxa 5 bash find cp

我有一个包含成千上万种不同文件类型的文件夹。我想将它们全部复制到一个新文件夹(Copy1),但也将它们全部重命名为$ RANDOM,但保留扩展名不变。我意识到我可以写一行指定要查找的扩展名和命名方式,但是必须有一种动态地进行扩展的方法,因为至少有100种文件类型,将来可能还会更多。

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

find ./ -name '*.*' -type f -exec bash -c 'cp "$1" "${1/\/123_//_$RANDOM}"' -- {} \;
Run Code Online (Sandbox Code Playgroud)

但这会将随机数放在扩展名之后,并且还将所有数字都放在同一文件夹中。我不知道如何做以下两件事:

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##*.}' -- {} \;
Run Code Online (Sandbox Code Playgroud)

谢谢!

Bol*_*boa 1

这是我想出的:

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
Run Code Online (Sandbox Code Playgroud)

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

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

whatever1.txt
whatever2.txt
etc etc
Run Code Online (Sandbox Code Playgroud)

我希望这就是您正在寻找的。