【问题标题】:Strip whitspace and make lower case up to hyphen - filename去除空格并将小写字母变为连字符 - 文件名
【发布时间】:2014-11-30 20:25:10
【问题描述】:

我有很多文本文件,我正在用特定格式重命名它们。下面我可以删除空格并制作小写。然而,这并不是我们想要的结果。

我怎样才能格式化(去掉空格并变成小写)连字符前面的所有内容,然后只占用连字符后面的第一个空格?

find /temp/ -depth -name "* *" -type f -exec rename 's/ +\././; y/A-Z /a-z_/' {} +

输入结果:

Hello Video - KEEP.txt

输出:

hello_video_-_keep.txt

想要的结果:

hello_video_-KEEP.txt

【问题讨论】:

    标签: linux bash ubuntu filenames rename


    【解决方案1】:

    您可以使用\L 转换为小写:

    rename 's/ +\././; y/ /_/; s/(.*?-)/\L$1/'
    
    • s/ +\././ 删除点前的一个或多个空格
    • y/ /_/ 将所有空格改为下划线
    • s/(.*?-)/\L$1/ 捕获第一个破折号之前的所有内容并将其小写。

    【讨论】:

    • 如果这个答案解释了\L 前面的所有东西的用途,它会更有用。
    • @Casimir:已更新。
    【解决方案2】:

    如果是我会使用的文件:

    sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1-\U\2/' -e 's/ /_/g' file
    
    • s/^([^-]*)-\s*([^\.]*)/\L\1-\U\2/ 将从文件开头到破折号- 的所有内容都转换为小写。然后它转换为大写直到点。
    • s/ /_/g 将所有空格转换为下划线_。

    对于您给定的文本,它返回:

    hello_video_-KEEP.txt
    

    如果您想保留从- 到. 的单词,请使用\E 恢复大小写。然后,我们也可以去掉多余的_-,把它换成-(有点丑,我知道)。

    $ cat file
    Hello Video - KEEP.txt
    My File - KeEp.txt
    $ sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g' file
    hello_video-KEEP.txt
    my_file-KeEp.txt
    

    提醒一下,这些是更改大小写的方法:

    • \L - 将所有进行中的字符转换为小写
    • \U - 将所有后续字符转换为大写
    • \E - 将所有进行中的字符保留在当前大小写中

    如何标记它有效?循环查看find 命令的结果:

    while read -r file
    do
       new_file=$(echo "$file" | sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g')
       echo "mv '$file' '$new_file'"
    done < <(find . -type f ...)
    

    对于给定的输入,这将产生以下内容:

    mv './My File - KeEp.txt' './my_file-KeEp.txt'
    mv './Hello Video - KEEP.txt' './hello_video-KEEP.txt'
    

    一旦您确定它有效,只需删除 echo 并单独使用 mv。注意引号是必须的!!否则它将无法正确处理文件名中的空格。

    【讨论】:

    • 好极了,但差不多了。但是在- 到. 之后的任何内容我都想保持不变,并且只从My File - KeEp.txt my_file-KeEp.txt 中删除- 之后的第一个空格
    • 完美,很好的解释。我将如何在temp 目录中的所有文件名上运行它?使用 for 循环?
    • @Code_Ed_Student 因为它是具有不同部分的sed,您可以使用find 的输出创建一个临时文件,然后将此sed 应用于它并最终执行它。
    • 哦,我有点迷路了。对脚本语法不太熟悉。但这不起作用sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g' find /temp/ -depth -name "* *" -type f rename -exec
    • 太好了,现在一切都说得通了。谢谢你解释清楚的答案。
    猜你喜欢
    • 2017-08-29
    • 2016-02-27
    • 2017-01-11
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多