繁体   English   中英

使用 Linux 中的 bash 脚本查找和重命名多个文件

[英]Find and rename multiple files using a bash script in Linux

例如,在目录/home/hel/files/中有成千上万的文件和数百个目录。 应用程序将其 output 文件保存在那里,文件名中带有特殊字符。 我想在所有文件名中用下划线替换这些特殊字符。 例如-:"<>@

我写了一个 bash 脚本,它只是重复使用 Linux/Unix 'rename' 重命名文件的命令。

示例:文件名: rename.sh

#!/bin/bash
rename "s/\'/_/g" *
rename 's/[-:"<>@\,&\s\(\)\[\]?!–~%„“;│\´\’\+#]/_/g' *
rename 'y/A-Z/a-z/' *
rename 's/\.(?=[^.]*\.)/_/g' *
rename 's/[_]{2,}/_/g' *

我执行以下查找命令:

find /home/hel/files/ -maxdepth 1 -type f -execdir /home/hel/scripts/rename.sh {} \+

现在的问题:

这很好用,除了它也会重命名子目录,如果它们的名称中有搜索的字符。

find 命令只搜索文件而不搜索目录。

我尝试了其他一些查找变体,例如:

find /home/hel/files/ -maxdepth 1 -type f -execdir sh /home/hel/scripts/rename.sh {} \+
find /home/hel/files/ -maxdepth 1 -type f -execdir sh /home/hel/scripts/rename.sh {} +
find /home/hel/files/ -maxdepth 1 -type f -execdir sh /home/hel/scripts/rename.sh {} \;

他们都在工作,但结果相同。

什么不起作用:

find /home/hel/files/ -maxdepth 1 -type f -exec sh /home/hel/scripts/rename.sh {} \+

这个很危险,因为它会重命名当前目录中的目录和文件,您也可以在其中调用 find 命令。

也许有人有一个想法,为什么会发生这种情况或有更好的解决方案。

脚本rename.sh根本没有使用它的命令行 arguments,而是使用 glob *自己搜索文件和目录(!)。

将您的脚本更改为以下内容。

#!/bin/bash
rename -d s/\''/_/g;
s/[-:"<>@\,&\s\(\)\[\]?!–~%„“;│\´\’\+#]/_/g;
y/A-Z/a-z/;
s/\.(?=[^.]*\.)/_/g;
s/[_]{2,}/_/g' "$@"

然后使用find... -maxdepth 1 -type f -exec sh.../rename.sh {} +

所做的更改

  • 使用"$@"而不是*来处理作为 arguments 给出的文件,而不是当前目录中的所有文件。
  • 只执行一次rename ,因为在第一次重命名后,第二次rename rename找不到用"$@"指定的文件。
  • 使用-d选项,以便仅修改基本名称。 find总是在文件前面放置一个路径,至少./ 如果没有此选项, rename会将./filename更改为mangledPath/newFilename并因此将文件移动到另一个目录。

请注意, man rename有点误导

--path, --fullpath
        Rename full path: including any directory component.  DEFAULT

-d, --filename, --nopath, --nofullpath
        Do not rename directory: only rename filename component of path.

对于给定的路径rename -d 's...' some/path/basename basename处理基本名称并忽略前导组件some/path/ 如果basename是一个目录,尽管有-d选项,它仍然会被重命名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM