重命名文件以匹配父文件夹

DGC

我想重命名目录中的所有文件以匹配父文件夹的名称。

现在,我发现了几种可以满足我需要的结果,但它们似乎都依赖于静态文件类型,路径,格式等。

我需要一个采用任何疯狂文件夹名称并将其应用于其中任何文件的文件,而其扩展名保持不变。我不希望父母的父母的父母等等。只是我可以在当前文件夹中运行的某件事会影响该文件夹中的所有子文件夹。

例如:

资料夹结构

This.Is.A.Crazy.Name.S00E00.720p
|
| asdfasdfasdfasdfasdfasdfafs.mkv
|
| info.nfo
|
| proof.jpg
|
You.See.Where.This.Is.Going.14x01.480p.crappo
|
| video.mp4

预期结果

This.Is.A.Crazy.Name.S00E00.720p
|
|_This.Is.A.Crazy.Name.S00E00.720p.mkv
|
|_This.Is.A.Crazy.Name.S00E00.720p.nfo
|
|_This.Is.A.Crazy.Name.S00E00.720p.jpg
|
You.See.Where.This.Is.Going.14x01.480p.crappo
|
| You.See.Where.This.Is.Going.14x01.480p.crappo.mp4

谁能建议在脚本或单个长命令中可以做到这一点吗?

点心

您可以使用rename

rename -n 's/(.*)\/.*\./$1\/$1./' */*

该命令需要在您要处理的目录正上方的目录中启动,就像在您的示例中一样。如果您对结果感到满意,它将首先列出更改以供您检查,如果不-n执行重命名就运行该更改。

如果在一个目录中有多个具有相同扩展名的文件,rename则将为每个文件显示警告,并将其排除在外。您可以用强制覆盖-f,但是我非常怀疑这是在这些(很少有)情况下要执行的操作。

运行示例

$ tree
.
├── This.Is.A.Crazy.Name.S00E00.720p
│   ├── asdfasdfasdfasdfasdfasdfafs.mkv
│   ├── info.nfo
│   └── proof.jpg
└── You.See.Where.This.Is.Going.14x01.480p.crappo
    └── video.mp4
$ rename 's/(.*)\/.*\./$1\/$1./' */*
$ tree
.
├── This.Is.A.Crazy.Name.S00E00.720p
│   ├── This.Is.A.Crazy.Name.S00E00.720p.jpg
│   ├── This.Is.A.Crazy.Name.S00E00.720p.mkv
│   └── This.Is.A.Crazy.Name.S00E00.720p.nfo
└── You.See.Where.This.Is.Going.14x01.480p.crappo
    └── You.See.Where.This.Is.Going.14x01.480p.crappo.mp4

解释

rename 's/(.*)\/.*\./$1\/$1./' */*
  • s/a/b/substituteab
  • (.*)\/.*\.–取所有内容,直到(不包括)最后一个斜杠将其保存为组1,并取斜杠和所有内容直至(包括)最后一个点
    并将其替换为
  • $1\/$1. –组1(目录名),斜杠,再次组1(文件名)和点(扩展名前的点,其本身没有被触及)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章