1

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

.
├── 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/' '{}' ';'

这可以进一步优化吗?

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

4

1 回答 1

2

rename是一个 perl 工具,允许您使用任何 perl 表达式。以下 perl 表达式搜索路径的最后一个组成部分(例如cin a/b/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' {} +

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

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

**/*递归列出所有文件和目录,并(On)反转类似于-depth.

✱ 因为bash你仍然可以使用**/*withshopt -s globstar但反转匹配文件的顺序并不容易,所以find更简单,可能更快。

于 2018-10-04T10:51:20.473 回答