【问题标题】:Rename all files in a directory by omitting last 3 characters通过省略最后 3 个字符来重命名目录中的所有文件
【发布时间】:2016-07-13 04:47:15
【问题描述】:

我正在尝试编写一个 bash 命令,通过省略最后 3 个字符来重命名当前目录中的所有文件。我不确定是否有可能这就是我在这里问的原因。

我有很多这样命名的文件:720-1458907789605.ts

我需要通过省略最后 3 个字符来重命名所有文件,以便从 720-1458907789605.ts 获取当前目录中所有文件的 720-1458907789.ts

是否可以使用 bash 命令?我是 bash 脚本的新手。

谢谢!

【问题讨论】:

    标签: bash grep find file-rename mv


    【解决方案1】:

    加上Larry Wall的重命名:

    rename -n 's/...\.ts$/.ts/' *.ts
    

    如果一切正常,请删除试运行选项 -n

    【讨论】:

      【解决方案2】:

      原生 bash 解决方案:

      for f in *.ts; do
          [[ -f "$f" ]] || continue # if you do not need to rename directories
          mv "$f" "${f:: -6}.ts"
      done
      

      如果你有很多文件,这个解决方案会很慢:for 中的星号扩展会占用内存和时间。

      参考:bash substring extraction.

      如果您有一个非常大的数据集,更复杂但更快的解决方案将是:

      find . -type f -name '*.ts' -depth 1 -print0 | while read -d $\0 f; do
          mv "$f" "${f%???.ts}.ts"
      done
      

      【讨论】:

      • 我有一个这样的 bash 脚本: location='/home/vod/canal3' cd $location && find 。 -maxdepth 1 -mmin +1 -type f -printf '%p\0%TF\0' |而 IFS= 读取 -rd '' 文件 && 读取 -d '' 日期; do mkdir -vp "$date" && mv "$file" "$date" 完成
      • 它基本上创建一个文件夹,用当前日期命名,然后将所有文件移动到它。我需要在移动之前或之后重命名文件,省略最后 3 个字符。如何在此脚本中实施您的建议?
      • 谢谢。最后一个问题,但如果我想忽略前 3 个字符,我会写在那里 ${???%file.ts}?我试过了,但没有用)
      • 其实不多。 ${file:: -6}.ts 从字符串末尾删除任意 6 个字符,然后附加 .ts${f%???.ts}.ts 删除字符串末尾的任意 3 个字符和 .ts(因为我们总是必须从某个点到末尾或开头删除所有内容,我们不能使用运算符 % 仅删除字符串的中间部分) , 然后追加 .ts.
      • 我认为,还有其他问题。我测试省略了前三个字符,它对我来说很好。但无论如何都有一个选择(我不太喜欢,但谁在乎:)):${file#???}。这意味着:从字符串的开头剥离三个任意字符(# 表示“从开头剥离”,? 表示“任意字符”)
      猜你喜欢
      • 2022-01-14
      • 2016-08-06
      • 1970-01-01
      • 2014-09-28
      • 2013-11-01
      • 1970-01-01
      • 2014-10-19
      • 2020-09-03
      • 2021-10-15
      相关资源
      最近更新 更多