如何通过替换文件名中的字符串来重命名多个文件?这个字符串包含一个“#”

91 sed rename mv

https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux

https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name

https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension

https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux

上面提到的这些文章都回答了我的问题。然而,它们都不适合我。我怀疑这是因为我试图替换的字符串中有一个 # 。有没有特殊的方法来解决这个问题?

我有一个图像文件,在站点迁移期间将 é 替换为 #U00a9。这些看起来像这样:

Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg
Run Code Online (Sandbox Code Playgroud)

我想把它改成这样:

Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg
Run Code Online (Sandbox Code Playgroud)

更新:

这些示例都以“LU00a9ucky”开头,但这里有许多名称不同的图像。我只是将字符串的“#U00a9”部分定位为“safe”。

Kri*_*Dev 125

要更换#somethingelse在当前目录下(不递归),你可以使用文件名GNU重命名工具:

rename  's/#/somethingelse/' *
Run Code Online (Sandbox Code Playgroud)

像这样的字符-必须用\.

对于您的情况,您希望使用

rename 's/#U00a9/safe/g' *
Run Code Online (Sandbox Code Playgroud)

请注意,如果您只想对特定选择的文件进行操作,例如 only *.jpg,请调整最终输入以匹配该选择:

rename 's/#U00a9/safe/g' *.jpg
Run Code Online (Sandbox Code Playgroud)

要在实际更改文件名之前执行测试,请使用以下-n标志:

demo/> ls                               
Lucky-#U00a9NBC-125x125.jpg  
Lucky-#U00a9NBC-150x150.jpg 

demo/> rename -n 's/#U00a9/safe/g' *.jpg
rename(Lucky-#U00a9NBC-125x125.jpg, Lucky-safeNBC-125x125.jpg)
rename(Lucky-#U00a9NBC-150x150.jpg, Lucky-safeNBC-150x150.jpg)
Run Code Online (Sandbox Code Playgroud)

对于 OS X,可以使用homebrew安装 GNU rename : brew install rename

  • 有两种常见的 `rename` 实用程序,但它们都不是由 GNU 开发的:基于 Debian 的发行版包括一个带有 Perl 包的 `rename` 实用程序,而基于 Red Hat 的发行版使用来自 `util-linux` 的 `rename` 实用程序来自 Linux 内核组织。您的链接指向 GNU 标准库中的 `rename` C **function**。 (6认同)
  • 这在我的机器(Arch Linux)上不起作用,但 mik 的答案可以。 (5认同)
  • 在这个答案中,为什么我们必须在 `rename 's/#U00a9/safe/g' *` 中写入 `/g` (4认同)
  • /g 表示全局搜索,即一旦它找到并替换字符串的一个实例,它将继续在文件名中搜索更多实例。所以 foo_foo.jpg 会变成 bar_bar.jpg。如果你没有放 g,foo_foo.jpg 会变成 bar_foo.jpg(只有 'foo' 的第一个实例会改变) (2认同)

小智 45

这并不难,只需确保通过在前面加上反斜杠 (\) 来转义名称中的 octothorpe (#)。

find . -type f -name 'Lucky-*' | while read FILE ; do
    newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
    mv "${FILE}" "${newfile}" ;
done 
Run Code Online (Sandbox Code Playgroud)


Suj*_*ale 41

找到文件列表,然后替换关键字。下面是例子

find . -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;
Run Code Online (Sandbox Code Playgroud)

  • 你的 `mv` 参数需要一些双引号,以防名称中有空格 (4认同)
  • 对于任何想知道的人来说,是的,这是递归的。 (2认同)

mik*_*mik 30

要从#shell 中转义,只需使用单引号 ( '#')、双引号 ( "#") 或反斜杠 ( \#)。

在您的情况下,最简单的方法是使用rename命令(如果可用):

rename '#U00a9' safe *.jpg
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。虽然投票最高的答案 (`rename 's/#/somethingelse/' *`) 在我的机器 (Arch Linux) 上不起作用,但这个答案起作用了。 (2认同)

Gre*_*ore 17

不知道如何在 sed 中,但您可以在 bash shell 中尝试:

for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;
Run Code Online (Sandbox Code Playgroud)

解释:

  1. 循环所有与 glob 匹配的文件名 (Lucky-#U00a9NBC-*.jpg)
  2. 使用移动命令(mv)重命名文件
  3. 使用原生 bash 参数替换 ${var/Pattern/Replacement} 来制作新名称 ("${f/#U00a9/safe}")

更多关于参数替换(这是高度未充分利用的 IMO):http : //www.tldp.org/LDP/abs/html/parameter-substitution.html