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)
我想递归的名字从改变Edition到Volume的目录,并在这些目录中的文件名。
我从这个开始,如果我在目录中就可以了:
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)
mv并rename识别--以指示选项的结束。由于./在此示例中所有路径都以 开头,因此我们不需要使用它,但是如果路径可能以 开头-,则--在选项的末尾使用,例如rename -n -- 's/foo/bar/' *,以防止这些路径被解释为选项。
您可以使用该命令rename两次来完成此任务:
rename 's/Edition/Volume/' */ # rename the directories
rename 's/Edition/Volume/' */*.pdf # rename the PDF files inside
Run Code Online (Sandbox Code Playgroud)
这里有两个类似的问题:
对于多级目录,可以一步完成,但问题是需要确保从下到上重命名目录,以防止命令或脚本在更改目录名称之前更改目录名称。
在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)
这在任意数量的级别上递归地工作。