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
我想把它改成这样:
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
更新:
这些示例均以“LU00a9ucky”开头,但这里有许多具有不同名称的图像。我只是将字符串的“#U00a9”部分替换为“safe”。
答案1
要替换当前目录中的文件名(非递归),您可以使用 (Perl- #
)somethingelse
改名公用事业:
rename 's/#/somethingelse/' *
像这样的字符-
必须用 转义\
。
对于您的情况,您需要使用
rename 's/#U00a9/safe/g' *
请注意,如果您只想操作特定的文件选择,例如,仅*.jpg
,请调整最终输入以匹配该选择:
rename 's/#U00a9/safe/g' *.jpg
要在实际更改文件名之前执行测试,请使用以下-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)
对于 OS X,可以使用以下命令安装 rename自制的: brew install rename
。
答案2
这并不难,只需确保通过在前面添加反斜杠 (\) 来转义名称中的 octothorpe (#)。
find . -type f -name 'Lucky-*' | while read FILE ; do
newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
mv "${FILE}" "${newfile}" ;
done
答案3
找到文件列表,然后替换关键字。下面是例子
find . -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;
答案4
不知道如何在 sed 中使用,但您可以在 bash shell 中尝试:
for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;
解释:
- 循环遍历与 glob 匹配的所有文件名 (Lucky-#U00a9NBC-*.jpg)
- 使用移动命令(mv)重命名文件
- 使用本机 bash 参数替换 ${var/Pattern/Replacement} 来制作新名称(“${f/#U00a9/safe}”)
有关参数替换的更多信息(在我看来,这是高度未充分利用的):http://www.tldp.org/LDP/abs/html/parameter-substitution.html