使用 sed 删除文件名中的空格和括号

HAK*_*AKS 5 bash sed rename

我有一系列需要重命名的文件,它们都包含模式“(*)”。例如;

001 (1).txt
002 (1).txt
003 (2).txt
Run Code Online (Sandbox Code Playgroud)

我想要的输出是将文件重命名为 001.txt、002.txt、003.txt。请注意,真实文件的长度和扩展名类型各不相同(这是我的测试批次)。

我已经搜索了网络和 SE 并提出了以下内容,它为我提供了终端中所需的输出。

ls *\(*\)* | sed 's/\(.*\)\( (.*)\)\(.*\)/mv & \1\3/'

mv 001 (1).txt 001.txt
mv 002 (1).txt 002.txt
mv 003 (2).txt 003.txt
Run Code Online (Sandbox Code Playgroud)

但是,一旦我将其通过管道传输到 sh,就会出现以下错误。

sh: line 1: syntax error near unexpected token `('
sh: line 1: `mv 001 (1).txt 001.txt'
Run Code Online (Sandbox Code Playgroud)

我知道这与该\( (.*)\)部分有关。我试过转义内部括号,但这并没有给我想要的输出。我还搜索了正则表达式方法来搜索空格后跟任意 3 个字符,但没有运气。

我知道有更简单的方法可以实现我想要的,但我使用 sed 到目前为止,这是我唯一能模糊理解的东西。非常感谢让上述线路工作的任何投入,然后考虑更简单的方法。

slm*_*slm 7

使用 Bash

您可以使用此命令仅使用 Bash 来执行此操作:

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

例子

$ ls -1
001 (1).txt
002 (1).txt
003 (2).txt
Run Code Online (Sandbox Code Playgroud)

运行上面的命令:

$ for file in ./*; do mv "$file" "${file/ (*)/}"; done
$ ls -1
001.txt
002.txt
003.txt
Run Code Online (Sandbox Code Playgroud)

使用重命名

一些发行版(Debian/Ubuntu)包括命令rename. 您可以使用此版本的rename.

$ rename -v 's/ \(.*\)\./\./' ./*.txt
Run Code Online (Sandbox Code Playgroud)

例子

$ rename -v 's/ \(.*\)\./\./' ./*.txt
001 (1).txt renamed as 001.txt
002 (1).txt renamed as 002.txt
003 (2).txt renamed as 003.txt

$ ls -1
001.txt
002.txt
003.txt
Run Code Online (Sandbox Code Playgroud)

但是,Red Hat 发行版不包含此版本的rename.

参考


ash*_*ash 1

有一个重命名命令可以做到这一点,但我从未使用过它。

你的剧本已经很接近了。尝试这个:

ls -d -- *\(*\)* | sed 's/\(.*\) (.*)\(.*\)/mv -- "&" "\1\2"/'
Run Code Online (Sandbox Code Playgroud)

请注意,“(”对于 shell 来说是一个特殊字符。将其放在双引号中会取消其特殊含义。