替换目录名和该目录中的文件名中的单词

Bis*_*hop 7 command-line scripts sed batch-rename mv

我有一个这样的目录结构:

Bookname Edition 1
  Bookname Edition 1 type1.pdf
  Bookname Edition 1 type2.pdf
Bookname Edition 2
  Bookname Edition 2 type1.pdf
  Bookname Edition 2 type2.pdf
Run Code Online (Sandbox Code Playgroud)

我想递归的名字从改变EditionVolume的目录,并在这些目录中的文件名。

我从这个开始,如果我在目录中就可以了:

Bookname Edition 1
  Bookname Edition 1 type1.pdf
  Bookname Edition 1 type2.pdf
Bookname Edition 2
  Bookname Edition 2 type1.pdf
  Bookname Edition 2 type2.pdf
Run Code Online (Sandbox Code Playgroud)

然后我尝试更改目录下的所有文件,这就是我卡住的时候......

请你能告诉我如何做到这一点或给我一个更好的方法来做到这一点。100 个目录中有 15000 个 PDF。

Zan*_*nna 10

如果您的结构只有两个级别,则不需要使用递归。

不要用sed. 如果要使用正则表达式和sed样式语法重命名文件,请使用rename. 如果您使用的是 Ubuntu 17.10,则需要安装它

sudo apt install rename
Run Code Online (Sandbox Code Playgroud)

然后你可以使用pa4080's answer

使用rename,使用-n选项进行测试。

rename -n 'expression' file(s)
Run Code Online (Sandbox Code Playgroud)

您也可以只使用该mv命令。作为一行命令:

for d in ./*/; do mv -v "$d" "${d/Edition/Volume}"; done; for f in ./*/*; do mv -v "$f" "${f/Edition/Volume}"; done
Run Code Online (Sandbox Code Playgroud)

您可以使用, ieecho进行测试,但这里给出的结果不准确,除非您测试然后单独运行循环。mvecho mv -v source dest

作为脚本:

#!/bin/bash

# rename directories first
for d in ./*/; do
    mv -v "$d" "${d/Edition/Volume}"
done

# now rename files
for f in ./*/*; do
    mv -v "$f" "${f/Edition/Volume}"
done
Run Code Online (Sandbox Code Playgroud)

mvrename识别--以指示选项的结束。由于./在此示例中所有路径都以 开头,因此我们不需要使用它,但是如果路径可能以 开头-,则--在选项的末尾使用,例如rename -n -- 's/foo/bar/' *,以防止这些路径被解释为选项。


pa4*_*080 7

您可以使用该命令rename两次来完成此任务:

rename 's/Edition/Volume/' */        # rename the directories
rename 's/Edition/Volume/' */*.pdf   # rename the PDF files inside
Run Code Online (Sandbox Code Playgroud)

这里有两个类似的问题:


Jac*_*ijm 7

对于多级目录,可以一步完成,但问题是需要确保从下到上重命名目录,以防止命令或脚本在更改目录名称之前更改目录名称。

在python中,您可以使用:

os.walk
Run Code Online (Sandbox Code Playgroud)

结合

topdown=False
Run Code Online (Sandbox Code Playgroud)

在脚本中:

os.walk
Run Code Online (Sandbox Code Playgroud)

将脚本另存为change_name.py,以目录为参数运行它:

python3 /path/to/change_name.py <directory>
Run Code Online (Sandbox Code Playgroud)

这在任意数量的级别上递归地工作。