【问题标题】:Optimal procedure to rename files in a linux directory重命名linux目录中文件的最佳过程
【发布时间】:2013-07-06 11:22:38
【问题描述】:

这个问题与重命名 Linux 系统目录中的文件有关,其中受影响的文件以这种通用格式显示:

index.html?p=155
index.html?page_id=10
index.html?author=2&paged=5
index.html?feed=rss2&tag=search-engine
index.html?tag=social-media

是否有一个 shell 级别的“重命名”命令可以用来将目录中每个文件中的问号 (?) 替换为下划线 (_)?

提前感谢您提供任何建议或信息!

【问题讨论】:

    标签: regex linux file-rename


    【解决方案1】:
    for file in index.html\?*; do
      new=${file/\?/_} # Substitute underscore for ?
      mv "$file" "$new" # Rename the file
    done
    

    有关使用的替换语法的信息,请参阅bash man page 的参数扩展部分。

    【讨论】:

    • 嗨!我将存储此代码并可能在将来使用它。使用 rename 命令的解决方案被证明是我正在寻求的短期解决方案,但您提供的似乎具有一些极好的长期价值。感谢您抽出宝贵时间回复我的问题,非常感谢!
    【解决方案2】:

    您可以使用重命名命令。

    rename '?' '_' *
    

    第一个参数是要替换的表达式,第二个参数是要替换第一个参数的字符串,最后一个选项是选择要应用它的文件(都在当前目录中,在这种情况下)

    有关详细信息,请参阅man pagehttp://ss64.com/bash/rename.html

    【讨论】:

      【解决方案3】:

      我自己更喜欢rename 命令,尽管有时滚动你自己的for 循环可能更有针对性。

      注意:rename 表达式作为要更改的参数,并将文件名作为最后一个参数。正确的使用调用是:

      rename 's/\?/_/' index*
      

      因为?在没有\转义时表示前面字符的0或1。

      这也更容易折腾成可以递归操作的find命令等:

      find . -name index.html* -exec rename 's/\?/_/' {} +
      

      【讨论】:

      • 感谢您提供出色的响应,在我尝试的那一刻就奏效了!更重要的是,感谢您提供一些我已经注意到的附加信息,以便我可以继续了解更多关于如何更有效地使用重命名功能的信息。再次感谢,我真的(真的!)感谢它!
      • 不客气 :) 我需要自己阅读更多关于 find 的内容,不过,还有更多内容……
      猜你喜欢
      • 2012-04-26
      • 2018-05-01
      • 2011-05-26
      • 2014-06-05
      • 2015-10-08
      • 1970-01-01
      • 2013-10-30
      • 2021-11-08
      • 2020-08-30
      相关资源
      最近更新 更多