【问题标题】:Recursively padding 0's in names of files and folders在文件和文件夹的名称中递归填充 0
【发布时间】:2019-03-09 16:46:16
【问题描述】:

我有一个文件夹,其中包含有关某些特定主题的视频讲座。它的结构是这样的:

.
├── 1_fol
│   ├── 1_file.mp4
│   ├── 2_file.mp4
│   └── 3_file.mp4
└── 2_fol
    ├── 10_file.mp4
    ├── 4_file.mp4
    ├── 5_file.mp4
    ├── 6_file.mp4
    ├── 7_file.mp4
    ├── 8_file.mp4
    └── 9_file.mp4

我想把这个结构改成

.
├── 001_fol
│   ├── 001_file.mp4
│   ├── 002_file.mp4
│   └── 003_file.mp4
└── 002_fol
    ├── 004_file.mp4
    ├── 005_file.mp4
    ├── 006_file.mp4
    ├── 007_file.mp4
    ├── 008_file.mp4
    ├── 009_file.mp4
    └── 010_file.mp4

这很有帮助,因为您可以使用 find . -regextype sed -regex ".*/.*\.\(mp3\|mp4\)" -print0 | sort -z | xargs -r0 vlc 打开整个播放列表。我想出了一个脚本来填充 0,但它非常冗长而且

find . -depth -exec rename -v 's/(.*)\/([0-9]$)/$1\/00$2/;
      s/(.*)\/([0-9]{2}$)/$1\/0$2/;
      s/(.*)\/([0-9][^0-9][^\/]*$)/$1\/00$2/;
      s/(.*)\/([0-9]{2}[^0-9][^\/]*$)/$1\/0$2/' '{}' ';'

这可以进一步优化吗?

编辑
实际上,在';'之后执行变得相当快已更改为“+”。但是这组正则表达式仍然看起来很丑。

【问题讨论】:

  • 重命名是正确的命令。如果那里有非 mp4 文件,您可以让 find 首先使用 -name 选择它们。将所有文件重命名为具有 3 个前导零然后重命名具有 4 或 5 位数字的文件可能更容易。
  • 您是否对每个文件进行了多次重新处理。 find 依次查找每个文件,因此在第一个文件夹中执行 3 次,但 rename 一次又一次地对文件夹中的所有文件起作用?
  • 我认为 '+' 会比 ';' 更好最后..你建议@GemTaylor有什么改变?为什么是“3”次?

标签: linux bash rename zsh pad


【解决方案1】:

rename 是一个 perl 工具,允许您使用任何 perl 表达式。以下 perl 表达式搜索路径的最后一个组成部分(例如 a/b/c 中的 c)并将其前导数字(如果存在)填充为三位数。

s/(^|\/)\K(\d+)(?=[^\/]*$)/sprintf "%03d",$2/e

示例:

  • 1_fol/23_file.mp4 变为 1_fol/023_file.mp4
  • 1_fol 变为 001_fol
  • 1_2/3_4.mp4 变为 1_2/003_4.mp4
  • 1_2 变为 001_2

在你的find 命令中使用上面的 perl 表达式来处理bash✱ ...

find -depth -exec rename 's/(^|\/)\K(\d+)(?=[^\/]*$)/sprintf "%03d",$2/ge' {} +

... 或 zsh 中的扩展 globstar 功能。在我的系统上,glob 比 find 更快。

rename 's/(^|\/)\K(\d+)(?=[^\/]*$)/sprintf "%03d",$2/ge' **/*(On)

**/* 递归列出所有文件和目录,(On) 颠倒顺序类似于-depth

✱ 对于bash,您仍然可以将**/*shopt -s globstar 一起使用,但是颠倒匹配文件的顺序并不是那么容易,所以find 更简单并且可能更快。

【讨论】:

  • 这太完美了!但是,shoptzsh 中不可用。 zsh 有什么替代品吗?
  • 我更新了我的答案。在这种情况下,由于目录创建问题,globstars 无法正常工作。在您的情况下,普通的 glob 应该足够了。无论如何:zsh 确实支持 globstars。我认为它们应该默认启用。只需省略shopt -s globstar
  • find -depth 类似于深度优先搜索,对于每个搜索结果,我都修改了最后一个“/”之后的内容。因此,在重命名文件夹之前,目录中的所有文件都已被重命名。
  • 啊,我明白了。我假设您一步将1_fol/1_file.mp4 重命名为001_fol/001_file.mp4。很简约。我将您的方法纳入我的回答中。
猜你喜欢
  • 1970-01-01
  • 2014-08-11
  • 2015-12-04
  • 2014-05-22
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
相关资源
最近更新 更多