Bash 一次性批量重命名文件和文件夹

Bash 一次性批量重命名文件和文件夹,bash,batch-rename,Bash,Batch Rename,我得到了关于以下问题的帮助: 这是如何重命名组中特定文件的一个很好的示例,但我想知道是否有类似的脚本可用于执行以下操作: 我在根目录中有一组嵌套的文件夹和文件,其中包含[myprefix_foldername]和[myprefix_filename.ext] 我想将所有文件夹和文件重命名为[foldername]和[filename.ext] 我可以使用类似于上面帖子的方法吗 谢谢! jml是的,很容易,有 这将为您提供rootDir中以myprefix\uu开头的所有文件和文件夹的列表。从这

我得到了关于以下问题的帮助:

这是如何重命名组中特定文件的一个很好的示例,但我想知道是否有类似的脚本可用于执行以下操作:

  • 我在根目录中有一组嵌套的文件夹和文件,其中包含[myprefix_foldername]和[myprefix_filename.ext]
  • 我想将所有文件夹和文件重命名为[foldername]和[filename.ext]
  • 我可以使用类似于上面帖子的方法吗

    谢谢! jml是的,很容易,有

    这将为您提供
    rootDir
    中以
    myprefix\uu
    开头的所有文件和文件夹的列表。从这里,我们可以快速跳转到批量重命名:

    find rootDir -name "myprefix_*" | while read f
    do
      echo "Moving $f to ${f/myprefix_/}"
      mv "$f" "${f/myprefix_/}"
    done
    
    编辑:
    根据添加的IFS

    编辑2:
    如果在阅读时删除了
    ,以支持

    编辑3:正如bos指出的那样,如果您的Bash版本仍然不喜欢它,您可能需要在读取f
    时将
    更改为
    而读取-d$'\n'f

    是的,非常容易

    这将为您提供
    rootDir
    中以
    myprefix\uu
    开头的所有文件和文件夹的列表。从这里,我们可以快速跳转到批量重命名:

    find rootDir -name "myprefix_*" | while read f
    do
      echo "Moving $f to ${f/myprefix_/}"
      mv "$f" "${f/myprefix_/}"
    done
    
    编辑:
    根据添加的IFS

    编辑2:
    如果在阅读时删除了
    ,以支持


    编辑3:正如bos所指出的,如果您的Bash版本仍然不喜欢它,您可能需要将读取f时的
    更改为读取-d$'\n'f时的

    如果文件夹名称中有空格怎么办?在这种情况下,它似乎失败了。。。如果你需要更多的细节,请告诉我。我不明白为什么会失败。你记得在
    $f
    ${f/myprefix./}
    周围加引号吗?让我看看它是如何失败的。。。。。。。。好的,是的,
    for
    命令正在分割充满空间的文件名。我能找到的最简单的解决方案是将
    IFS=“\n”
    放在脚本中,如图所示:@jml-我想出了一种稍微不那么混乱的方法,它不需要
    IFS
    。请参阅编辑后的答案。这里我们不知道的是jml bash的版本。较旧的bash具有空间作为“读取”的分隔符,而较新的bash具有\n。如果jml使用旧版本,请将读取f
    时的
    更改为读取-d'\n'f
    时的
    。如果文件夹名称中有空格怎么办?在这种情况下,它似乎失败了。。。如果你需要更多的细节,请告诉我。我不明白为什么会失败。你记得在
    $f
    ${f/myprefix./}
    周围加引号吗?让我看看它是如何失败的。。。。。。。。好的,是的,
    for
    命令正在分割充满空间的文件名。我能找到的最简单的解决方案是将
    IFS=“\n”
    放在脚本中,如图所示:@jml-我想出了一种稍微不那么混乱的方法,它不需要
    IFS
    。请参阅编辑后的答案。这里我们不知道的是jml bash的版本。较旧的bash具有空间作为“读取”的分隔符,而较新的bash具有\n。如果jml使用旧版本,请将读取f
    时的
    更改为读取-d'\n'f
    时的