【问题标题】:How to copy files recursively, rename them but keep the same extension in Bash?如何递归地复制文件,重命名它们但在 Bash 中保持相同的扩展名?
【发布时间】:2021-08-20 15:57:25
【问题描述】:

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

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

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

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

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##*.}' -- {} \;

谢谢!

【问题讨论】:

  • 随机是一个 15 位整数 (0-32k)。您将遇到冲突,并且对于“数万”个文件,您很可能会完全用完随机数。
  • 你需要处理嵌套文件夹吗?
  • 好吧,我保留文件夹结构,每个文件夹不超过一百个文件,所以不应该有任何冲突。基本上结果应该像这个原始文件夹一样,子文件夹和文件未受影响。以根目录创建新文件夹,复制原始文件夹的整个目录结构和文件。但是每个文件和文件夹都被重命名为随机数字或字母(没关系)。
  • 我认为如果您检查并更新您的问题,您可能会得到更好的答案...首先您说您有a folder,然后您开始谈论多个子文件夹 - 哪个?然后你说你有成千上万的文件类型,然后at least 100 - 哪个?如何向我们展示一些文件名和一些结构以及它应该如何结束?
  • 只是好奇:用随机数替换文件名有什么意义?我很难想象一个我想要的用例。根据给定的正则表达式替换模式重命名文件,好的,但完全丢弃文件名?

标签: bash find cp


【解决方案1】:

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

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##*.}' -- {} \;

或者使用 uuid 代替随机数:

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

【讨论】:

    【解决方案2】:

    这是我想出的:

    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
    

    我希望这就是你要找的。​​p>

    【讨论】:

    • 我在 MacOS 上执行此操作,当尝试使用该代码时,我从 cp 命令收到错误,它不知道该怎么做,并为我提供了帮助文件。另外 $RANDOM 我的意思是实际的随机值,而不是单词。
    • 我相应地重新编辑,如果以下不起作用,那么我不知道该说什么...我只是在我的comp上尝试过,它工作正常。我会继续调查的。
    • 还是不行,你是用Linux运行的吗?还是你在 MacOS 上?我不明白 /Path/Name/ 位的用途?它只需要是脚本所在的根目录。假设有一个文件夹,里面有一个文件夹 1,文件夹 1 里面有 10 个文件。我需要 sript 来复制根文件夹并将其命名为随机名称,然后在其中复制 folder1 并将其命名为随机名称,然后复制其中的所有文件,但将每个文件重命名为随机名称,但保留扩展名。
    • 我想另一种看待这个的方式......如何将整个内容复制到一个具有随机名称的新文件夹,然后递归地将每个文件夹/文件的名称更改为随机值?这将是相同的事情,只需 2 个步骤,而不是在复制时重命名的 1 个步骤。重申一下,文件/文件夹名称可以是任何东西,越随机越好!只要扩展名保持不变。
    • 尝试在复制命令中添加cp -R,复制整个根目录,所有文件名都将更改为随机。对于路径名,这是您的新目录的位置,所有内容都将复制到其中。因此,如果您在主目录中,并且有一个名为 randomFolder 的空文件夹,那么您的 cp 命令将是 -> cp -R $f randomFolder/"$newbase"
    【解决方案3】:

    这是对我有用的命令。

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

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 2020-04-12
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多