【问题标题】:Trimming a part of file extension for all the files in directory - Linux修剪目录中所有文件的部分文件扩展名 - Linux
【发布时间】:2016-01-05 00:15:28
【问题描述】:

我有一个要求,我想修剪目录中包含的所有文件的文件扩展名:-

文件会是这样的;

America.gz:2170
Europe.gz:2172
Africa.gz:2170
Asia.gz:2172

我需要从所有文件中删除 :2170 和 :2172 ,以便只保留 .gz 扩展名。

我知道在下面的 SED 代码的帮助下,文件中的所有条目都是可能的,但是我需要目录中的所有文件:-

**sed 's/:.*//' file**

任何修复此问题的 bash 或 awk 代码都将受到高度赞赏。

提前致谢。

【问题讨论】:

    标签: regex linux bash awk sed


    【解决方案1】:

    你可以在bash:

    shopt -s nullglob
    for f in *.gz:*; do
        mv -- "$f" "${f%:*}"
    done
    

    "${f%:*}" 将删除变量 $f 的 RHS 上 : 之后的所有内容

    【讨论】:

    • 最好是shopt -s nullglob。
    • @gniourf_gniourf 您是否需要将其设为mv -- "$f"... 才能使其“完美”:-)?我真的不确定它会对名称以 - 开头的文件执行什么操作。
    • 哇,这简直是奇迹!感谢 Anubhava、Gniourf 和 Ed。您能否帮助我从代码中理解以下内容: - mv -- "$f" "${f%:*}" 1) 为什么我们使用 -- 2) 是否必须将变量括在双引号中?我们不能只使用 $f 而不是 "$f" 3) 使用 {} 的意义是什么 伙计们,我是零编程背景的真正初学者,刚开始使用 YouTube 视频和其他在线资源学习 bash 脚本。您能否建议任何好的来源/链接/pdf/视频,我可以从头开始并以良好的水平完成它。非常感谢!
    • @user5419230:在-- 之后保留参数告诉mv 不应将参数解释为mv 命令的选项。引用变量是一种很好的做法,对于文件名尤其重要,因为文件名在 Unix 中也可以包含空格或换行符。有很多关于 Unix shell 脚本的好教程。你可以谷歌一下。
    • @anubhava 现在我遇到了另一个问题。我的系统已将文件名更改为如下。 SimilarX.LCA}33362}1444572402}0}coll_DefaultColl} SimilarY.LCA}33362}1444572402}0}coll_DefaultColl} SimilarZ.LCA}33362}1444572402}0}coll_DefaultColl} 我想修剪最后一个,使其如下所示: - SimilarX.LCA SimilarY.LCA SimilarZ.LCA 我将代码更改为; #!/bin/bash shopt -s nullglob for f in .AIR}; do mv -- "$f" "${f%(}*)}" done 但是它不起作用。请帮我解决这个问题。
    【解决方案2】:

    您可以使用重命名命令。

    rename 's/:.*//' *.gz:*
    

    或

    rename 's/:[^:]*$//' *.gz:*
    

    【讨论】:

    • 这对于名为 hello:how:are:you.gz:1234 的文件会很危险。
    【解决方案3】:

    整个工作可以通过for 循环和子字符串处理运算符'%'来完成:

    "${parameter%word} 删除最小后缀模式。"

    #!/bin/sh
    
    for i in *
    do #mv "$i" "${i%:}"
       echo " mv $i ${i%:*}"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 2013-01-30
      • 2023-03-12
      • 2019-01-01
      • 2018-08-12
      相关资源
      最近更新 更多