将 ACDC 替换为 AC-DC
例如我们有这些文件
ACDC——摇滚乐不是噪音污染。xxx
ACDC-Rocker.xxx
ACDC – Shoot To Thrill.xxx
我希望他们成为:
AC-DC——摇滚乐不是噪音污染。xxx
AC-DC-Rocker.xxx
AC-DC – 射击惊险.xxx
我知道这个操作需要用到 sed 或 awk。我无法用 Google 搜索到任何内容,所以我请求您的帮助 =) 您能否提供用于此任务的完整工作 shell 命令?
反馈:OSX 用户的解决方案
答案1
rename 's/ACDC/AC-DC/' *.xxx
从man rename
DESCRIPTION
"rename" renames the filenames supplied according to the rule specified as the
first argument. The perlexpr argument is a Perl expression which is expected to modify the
$_ string in Perl for at least some of the filenames specified. If a given filename is not
modified by the expression, it will not be renamed. If no filenames are given on
the command line, filenames will be read via standard input.
例如,要重命名所有匹配“*.bak”的文件以删除扩展名,你可以说
rename 's/\.bak$//' *.bak
要将大写名称转换为小写,您可以使用
rename 'y/A-Z/a-z/' *
答案2
这个答案包含了其他所有答案中的好的部分,同时省略了诸如这样的异端邪说ls | while read
。
当前目录:
for file in ACDC*.xxx; do
mv "$file" "${file//ACDC/AC-DC}"
done
包括子目录:
find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
mv "$file" "${file//ACDC/AC-DC}"
done
换行符真的不太可能出现在文件名中,因此这可以更简单,同时仍然处理包含空格的名称:
find . -type f -name "ACDC*" | while read -r file; do
mv "$file" "${file//ACDC/AC-DC}"
done
答案3
rename
要使用Phil 提到的util-linux 版本(在 Ubuntu 上,它被称为rename.ul
):
rename ACDC AC-DC ACDC*
或者
rename.ul ACDC AC-DC ACDC*
答案4
取决于你的 shell。在 zsh 中,我会这样做:
for file in ACDC*.xxx; do
mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done
可能不是最好的解决方案,但是有效。