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 / 问题 / 410257
Accepted
file woes
file woes
Asked: 2017-12-12 10:09:53 +0800 CST2017-12-12 10:09:53 +0800 CST 2017-12-12 10:09:53 +0800 CST

递归地从文件名中删除字符

  • 772

我有数百个目录,其中一些嵌套在其他目录中,文件数以万计。这些文件需要从其中删除日期/时间戳。

一个示例文件名是Letter to Client 27May2016~20160531-162719.pdf,我希望它恢复原状Letter to Client 27May2016.pdf

另一个示例文件名是ABCDEF~20160531-162719,我希望它恢复为ABCDEF. 请注意,与上面的示例不同,此文件没有扩展名。

我需要一个可以在受影响文件夹的根目录运行的命令,该命令将递归地通过并查找/修复文件名。

(我使用 Syncthing 同步文件,并通过将已删除的文件从.stversions目录复制回它们所在的位置来恢复它们,但发现 Syncthing 附加了该日期/时间戳......)

rename
  • 3 3 个回答
  • 5383 Views

3 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2017-12-12T10:15:14+08:002017-12-12T10:15:14+08:00

    认识 Perlrename工具:

    $ rename -n -v  's/~[^.]+//' *~*
    rename(ABCDEF~20160531-162719, ABCDEF)
    rename(Letter to Client 27May2016~20160531-162719.pdf, Letter to Client 27May2016.pdf)
    

    (在线手册页,另见此 Q)

    该正则表达式表示要匹配波浪号,因为许多字符不是点,但至少是一个;并用空字符串替换任何匹配的内容。删除-n以实际进行替换。我们可以将模式更改~[-0-9]+为仅替换数字和破折号。

    抱歉,您说的是“递归”,所以让我们使用find:

    $ find -type f -name "*~*" -execdir  rename -n -v  's/~[-0-9]+//' {} +
    rename(./ABCDEF~20160531-162719, ./ABCDEF)
    rename(./Letter to Client 27May2016~20160531-162719.pdf, ./Letter to Client 27May2016.pdf)
    

    或者只是使用 Bash 或 ksh,尽管~后跟数字的目录会破坏这一点:

    $ shopt -s extglob       # not needed in ksh (as far as I can tell)
    $ shopt -s globstar      # 'set -o globstar' in ksh
    $ for f in **/*~* ; do 
        g=${f//~+([-0-9])/}; 
        echo mv -- "$f" "$g" 
      done
    mv -- ABCDEF~20160531-162719 ABCDEF
    mv -- Letter to Client 27May2016~20160531-162719.pdf Letter to Client 27May2016.pdf
    

    再次,删除echo实际进行重命名。

    • 5
  2. Jeff Schaller
    2017-12-12T10:27:11+08:002017-12-12T10:27:11+08:00

    在 bash 中:

    shopt -s globstar
    for file in **/*~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]*
    do
      echo mv -- "$file" "${file/~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]/}"
    done
    

    这会找到所有与日期模式匹配的文件名(递归)(在波浪号之后),然后回显一个示例mv命令来重命名它们。mv 命令的目标是 bash 参数扩展的结果,它将任何波浪号日期字符串文本替换为空。

    • 3
  3. Praveen Kumar BS
    2017-12-12T17:57:27+08:002017-12-12T17:57:27+08:00

    代码:

    echo "ABCDEF~20160531-162719" | sed "s/~.*//g"
    echo "Letter to Client 27May2016~20160531-162719.pdf" |sed "s/~.*[^.pdf]//g"
    

    以上命令实现了上述结果

    • -1

相关问题

  • Krename:如何为每个文件夹重新编号?

  • 根据其中的值批量重命名(附加)CSV 文件

Sidebar

Stats

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

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

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

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +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