AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 453340
Accepted
kurokirasama
kurokirasama
Asked: 2018-07-04 17:18:05 +0800 CST2018-07-04 17:18:05 +0800 CST 2018-07-04 17:18:05 +0800 CST

重命名文件删除部分文件名 bash 脚本

  • 772

我有一些格式的文件:

filename1 1 extra1.ext
filename1 2.ext
filename1 3 extra2.ext
...
filename2 1.ext
filename2 100 extra3.ext
...
filename20 1.ext
filename20 15 extra100.ext
(etc.)

...其中filename1,filename2等可以包含空格和符号,例如数字、字母、[、]、和(,但不能包含包含在空格中的数字。和,等可以包含任何内容。由空格包围的文件名中的数字不会重复,等等。)'extra1extra2filename1filename2

我想要的是删除包含它的文件的额外内容。也就是说,从filename20 15 extra100.ext到filename20 15.ext

此外,我需要在目录的内容中循环它,所以我还需要区分具有额外内容的文件(然后应用重命名方法)和没有的文件。

可能吗?我刚从 windows 转到 linux,我有一个批处理脚本,但我不知道如何在 bash 中开始。

问候,

shell-script
  • 1 1 个回答
  • 2177 Views

1 个回答

  • Voted
  1. Best Answer
    Sparhawk
    2018-07-04T17:27:15+08:002018-07-04T17:27:15+08:00

    使用 (perl) 重命名。命令如下:

    rename 's/( [0-9]*) .*\.ext/$1.ext/' *
    

    rename请注意,Linux 发行版通常附带两个s。默认值通常是更简单的版本。基于 perl 的重命名功能更强大,因为它使您可以访问正则表达式。确保您使用的是后者。(你没有提到你的发行版,但在 Arch 中,它是由 package 提供的perl-rename。)

    先测试一下

    创建文件(我在最后添加了一个额外的文件)。

    $ touch 'filename1 1 extra1.ext' 'filename1 2.ext' 'filename1 3 extra2.ext' 'filename2 1.ext' 'filename2 100 extra3.ext' 'filename20 1.ext' 'filename20 15 extra100.ext' 'filename3 1 3 4 .ext'
    

    测试命令

    $ rename 's/( [0-9]*) .*\.ext/$1.ext/' * -n
    filename1 1 extra1.ext -> filename1 1.ext
    filename1 3 extra2.ext -> filename1 3.ext
    filename20 15 extra100.ext -> filename20 15.ext
    filename2 100 extra3.ext -> filename2 100.ext
    filename3 1 3 4 .ext -> filename3 1.ext
    

    如果您对结果感到满意,请删除“dry-run”/test 标志-n并真正运行它。

    解释

    • rename 's/foo/bar/' *: perl rename 会将出现的正则表达式替换foo为bar. 这作用于*当前目录中的所有文件。您也可以明确地将其替换为*.ext以限制它作用于哪些文件。
    • /( [0-9]*) .*\.ext: 匹配一个空格,然后是一串数字,[0-9]*然后是另一个空格。将第一个空格和数字包含在捕获组( [0-9]*)中,以供以后重用。然后匹配所有内容.*,包括扩展名\.ext。因为这个正则表达式是“贪婪的”,它会尝试匹配尽可能多的字符。即,如果文件名部分有被空格包围的数字extra,它将匹配它们。
    • /$1.ext将此匹配部分替换为上面的捕获组$1,即空格和数字,后跟扩展名.ext。
    • 3

相关问题

  • 在awk中的两行之间减去相同的列

  • 打印文件行及其长度的脚本[关闭]

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • MySQL Select with function IN () with bash array

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve