【问题标题】:How to modify file names in bash如何在bash中修改文件名
【发布时间】:2014-04-17 01:19:02
【问题描述】:

我有一个类似的目录:/data/work/files/

calldata_phonecalls_2131201401_01.zip calldata_phonecalls_7373201401_02.zip

在这个目录中,我想创建新的文件对应的zipfiles like,但修改了BASH中的一小部分名称:

calldata_calllog_2131201401_01.tsv calldata_calllog_7373201401_02.tsv

请注意“电话”更改为“通话记录”

请帮忙。

【问题讨论】:

    标签: bash


    【解决方案1】:

    使用Shell Parameter Expansionbasename

    for f in /data/work/files/*.zip; do
      mv "$f" "$(basename "${f/phonecalls/calllog}" .zip).tsv"
    done
    

    使用rename(perl 发行版的一部分):

    rename 's/phonecalls/calllog/;s/\.zip$/.tsv/' /data/work/files/*.zip
    

    【讨论】:

    • @HomayounAfshari 没注意到;现在应该修好了。
    • @user1189851 名称修改?
    • 打扰一下@devnull,你能解释一下 ${f/x/y} 的工作原理吗?
    • @HomayounAfshari 它会将 x 替换为 y
    • @HomayounAfshari 是的,这叫shell参数扩展。请参阅上面编辑中的链接。
    【解决方案2】:

    使用重命名:

    使用一个版本的重命名:

    rename 's/^fgh/jkl/' fgh*
    

    使用其他版本的重命名:

    rename fgh jkl fgh*
    

    您应该查看您平台的手册页以了解上述哪一项适用。

    使用 mv:

    find ./ -name "*.xyz\[*\]" | while read line
    do 
    mv "$line" ${line%.*}.xyz
    done
    

    另一种方式

    ls -1 | nawk '/foo-bar-/{old=$0;gsub(/-\(.*\)/,"",$0);system("mv \""old"\" "$0)}'
    

    还有一个:

    for f in fgh*; do mv $f $(echo $f | sed 's/^fgh/jkl/g'); done
    

    stackoverflow 和超级用户页面下还有其他几个答案:

    从以下链接复制/总结:

    Rename multiple files in Unix

    How to use mv command to rename multiple files in unix?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多