![自动查找并删除文件名中的常用词](https://linux22.com/image/1377258/%E8%87%AA%E5%8A%A8%E6%9F%A5%E6%89%BE%E5%B9%B6%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E7%9A%84%E5%B8%B8%E7%94%A8%E8%AF%8D.png)
我使用的是 Mac OS 10.8.4,想使用终端(我认为是 bash shell)进行批量重命名。我有大量文件夹,里面有大量文件。文件名中包含与文件夹中其他文件相同的单词,我想检测并删除这些单词(不包括文件后缀)。
例如:
文件夹 1 包含文件:
blo 123b 2blah 5blah.pdf
blo hazel 124 2blah 5blah.pdf
blo 125 2blah 5blah.pdf
文件夹 2 包含文件:
534a blee9.pdf
b546 blee9.pdf
back 675 blee9.pdf
我想将它们重命名为
文件夹 1
123b.pdf
hazel 124.pdf
125.pdf
文件夹 2
534a.pdf
b546.pdf
back 675.pdf
我有可以查找和替换的应用程序,但这些应用程序需要我手动指定要查找的内容。但如果不手动查找,我就不会提前知道这些是什么。此外,可能需要替换的单词可能不止一个。
所以我想我可以做这样的事情:
for each folder {
list all the filenames > output.txt
use grep, replace all word breaks with carriage returns
sort the list alphabetically
use uniq in some way to detect the words I want to remove, and list them
iteratively remove all these words from the file names
}
一些额外的注意事项:“单词”可能包含 =、-、+ 等字符。我想使用 [空格] 作为单词分隔符。
有人能帮忙吗?
答案1
我会在 perl 中做这件事,因为我不太擅长使用 bash。
- 递归循环遍历所有文件夹(寻找树遍历算法,相当简单)
- 对于每个文件夹,列出所有文件
ls
- 用来
split(' ', sfilename);
制作所用单词的列表。插入列表中@common_words
- 对于每个下一个文件,以相同的方式拆分其名称,并删除不在
@common_words
. 中的任何单词$filename
(例如,使用 perl 的 grep,或使用循环) - 获得常用单词列表后,重新循环遍历文件,并针对每个文件
- 对于每个文件,对于每个单词,重命名文件以删除该单词(使用 bash
mv
和 perl 的system
) - 完毕。
这是启动脚本这需要重新加工但可以解决您的问题。
问题 :
- 如果你的文件全部以“_word.ext”结尾,则扩展名将被删除
- 如果取消注释忽略扩展名的替换,则 mv 不再起作用,因此您必须将名称保存在哈希中:name_without_extention => "name_with_extension'
- 它只解析单个文件夹并使用子文件夹名称,因此您必须确保在没有子文件夹的文件夹中使用它。
现在就由你来改进它了=)
答案2
我已经为一个目录中的文件编写了代码。首先,我在终端中导航到该目录,然后运行 Python 脚本。它可以很好地删除文件名的部分内容,例如“720dpi”,而无需事先知道确切的文本。我是 Python 初学者,因此代码可能需要改进。