自动化重命名文件 bash 脚本

Rts*_*e42 2 command-line bash scripts files batch-rename

我的驱动器上有很多扩展名为 .odt 的文档。例子: 在此处输入图片说明

但是,我发现 .odt 在浏览大量文档时会分散注意力。

所以,我设法编写了这个脚本(removeODT.sh):

#!/bin/bash

for file in *.odt
do
 mv "$file" "${file%.odt}"
done
Run Code Online (Sandbox Code Playgroud)

这会从我执行脚本的目录中的 .odt 文件中删除 .odt 扩展名。

例如在 ~/Desktop/MyDocuments 中打开终端并输入

sh /home/user1/BashScripts/removeODT.sh

这将从 MyDocuments 中的所有文件中删除 .odt 扩展名。

但是去掉扩展名后,其他操作系统上的文件无法使用,也无法搜索文件内容loook

所以为了解决这个问题,我创建了第二个脚本来在需要时添加 .odt 扩展名 (addODT.sh):

#!/bin/bash

for file in *
do
 mv "$file" "${file%}.odt"
done
Run Code Online (Sandbox Code Playgroud)

现在,我想做的是让这些脚本更改指定父目录及其所有子目录中的每个文档,而不是像现在那样只更改单个目录。

例如“从文档及其所有子文件夹中的文件中删除 .odt 扩展名”

这将允许我使用单个脚本更改我的所有文件,而不必分别为每个文件夹执行脚本。但我对此很陌生,所以我不知道如何去做。

PS 一个理想的解决方案是在 Nautilus 中隐藏 .odt 扩展名,但据我所知这是不可能的。

cho*_*oba 7

您可以使用find递归遍历目录。

find -type f -exec mv {} {}.odt \;
Run Code Online (Sandbox Code Playgroud)

删除扩展程序有点问题:

find -name '*.odt' -exec bash -c 'f={}; mv "$f" "${f%.odt}"' \;
Run Code Online (Sandbox Code Playgroud)

但是您也可以创建一个脚本来删除扩展并从 find 中调用它以使其更简单:

find -name '*.odt' -exec remove_odt.sh {} \;
Run Code Online (Sandbox Code Playgroud)

您可以猜到,{}将被每个文件名替换为exec,最后\;表示要执行的命令在哪里结束。

另外,不要sh用于运行bash脚本,sh并且bash是不同的野兽。