【问题标题】:Remove underscores from all filenames within a directory从目录中的所有文件名中删除下划线
【发布时间】:2023-03-19 03:35:01
【问题描述】:

我有一个文件夹“模型”,其中包含如下文件:

a_EmployeeData
a_TableData
b_TestData
b_TestModel

我基本上需要删除下划线并制作它们:

aEmployeeData
aTableData
bTestData
bTestModel

在 Unix 命令行中是否可以这样做?

【问题讨论】:

  • 澄清一下,您是要重命名文件还是只打印不带下划线的文件名?
  • 如果 `foo_bar' 和 'foobar' 都存在,请决定你想做什么。
  • 他们不会……当然。
  • 请重命名文件...

标签: unix command-line scripting replace filenames


【解决方案1】:
for f in model/* ; do mv "$f" `echo "$f" | sed 's/_//g'` ; done

编辑:由于其他人的建议修改了一些东西,但我担心我的代码对于奇怪的文件名仍然不好。

【讨论】:

  • 使用`ls model` 是不安全的,除此之外,如果文件名有空格,它将无法正常工作(我知道 OP 的示例没有,但我们应该尽量避免可能出现的情况,例如这个)
  • 你可以使用for f in model/* - 不需要无用的ls model
【解决方案2】:
marc@panic:~$ echo 'a_EmployeeData' | tr -d '_'
aEmployeeData

【讨论】:

    【解决方案3】:

    这将正确处理包含奇怪字符(如空格甚至换行符)的文件,并且应该适用于任何仅基于 POSIX 语法的 Unix/Linux 发行版。

    find model -type f -name "*_*" -exec sh -c 'd=$(dirname "$1"); mv "$1" "$d/$(basename "$1" | tr -d _)"' sh {} \;
    

    这是它的作用:

    对于模型目录及其子目录下名称中包含下划线的每个文件(不是目录),在删除所有下划线的情况下重命名文件。

    【讨论】:

    • nitpick:它不适用于名称以换行符结尾的目录中的文件。如果省略-type f,则需要添加-depth
    • 如果你有一个aba_ba__b 文件,你会丢失其中的两个(或者将a_ba__b 移动到ab 中,如果@ 987654330@ 是一个目录。您可能需要将-i 添加到mv(并添加特定于GNU 的-T 选项)或使用zmv 来防止这种情况发生。
    • @StephaneChazelas 你(几乎总是)是正确的。然而,这些是极不可能击中 OP 的极端情况,因此可能不值得考虑。特别是在 gran_profaci 的评论之一中似乎排除了名称冲突问题。
    • 如果您从命令中删除模型并直接转到源目录(它将原地重命名),这会很好。 find -type f -name "_" -exec sh -c 'd=$(dirname "$1"); mv "$1" "$d/$(basename "$1" | tr -d _)"' sh {} \;
    【解决方案4】:

    您只需使用bash 即可完成此操作。

    for file in /path/to/model/*; do
    mv "$file" "${file/_/}"
    done
    

    如果您有可用的rename 命令,那么只需执行此操作

    rename 's/_//' /path/to/model/*
    

    【讨论】:

    • 这绝对有效!,不要记得在定义路径时添加\ 而不是空格` `!
    • 可能是为了避免警告等。如果您在同一目录中也有没有下划线的文件,您可以调整为for file in /path/to/model/_*; do...
    【解决方案5】:

    也许是这样的:

    find model -name "*_*" -type f -maxdepth 1 -print |  sed -e 'p;s/_//g' | xargs -n2 echo mv
    

    分解:

    • model目录中查找所有plain files,其中至少包含一个下划线,不要搜索子目录
    • 使用 sed 进行文件名调整 - 将 _ 替换为空
    • 还打印旧名称
    • 将这两个文件名输入xargs 将用mv 重命名文件

    以上内容用于试运行。满意后,删除mv 之前的echo 以进行实际重命名。

    警告:如果文件名包含空格,则将不起作用。如果你有GNU sed 你可以

    find . -name "*_*" -maxdepth 1 -print0 |  sed -z 'p;s/_//g' | xargs -0 -n2 echo mv
    

    也适用于带空格的文件名...

    【讨论】:

      【解决方案6】:

      在 zsh 中:

      autoload zmv # in ~/.zshrc
      cd model && zmv '(**/)(*)' '$1${2//_}'
      

      【讨论】:

        【解决方案7】:

        我的机器上遇到了同样的问题,但文件名有多个下划线。我将renameg 选项一起使用,以便删除所有下划线:

        find model/ -maxdepth 1 -type f | rename 's/_//g'
        

        或者如果没有子目录,就直接

        rename 's/_//g'
        

        如果您没有rename,请参阅Jaypal Singh's answer

        【讨论】:

          猜你喜欢
          • 2020-05-19
          • 1970-01-01
          • 2015-04-11
          • 2016-04-15
          • 1970-01-01
          • 1970-01-01
          • 2014-07-11
          • 2019-08-27
          • 2010-11-05
          相关资源
          最近更新 更多