将ACDCreplace为AC-DC
例如,我们有这些文件
ACDC – 摇滚乐不是噪音Pollution.xxx
ACDC – Rocker.xxx
ACDC – 拍摄到Thrill.xxx
我希望他们成为:
交stream – 直stream – 摇滚不是噪音污染.xxx
AC-DC – Rocker.xxx
AC-DC – 拍摄到Thrill.xxx
我知道sed或awk用于这个操作。 我不能谷歌任何东西,所以我要求你的帮助=)你能提供完整的工作shell命令这个任务?
反馈: OSX用户的解决scheme
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/AZ/az/' *
这个答案包含了所有其他答案中的好的部分,而忽略了ls | while read
这样的异端 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
要使用Phil提到的rename
的util-linux版本(在Ubuntu上,它被称为rename.ul
):
rename ACDC AC-DC ACDC*
要么
rename.ul ACDC AC-DC ACDC*
使用bash shell
find . -type f -name "ACDC*" -print0 | while read -d $'\0' f do new=`echo "$f" | sed -e "s/ACDC/AC-DC/"` mv "$f" "$new" done
注意:使用find
会处理当前目录下的目录。
取决于你的shell。 在zsh中,我会这样做:
for file in ACDC*.xxx; do mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')" done
可能不是最好的解决scheme,但工作。
使用bash:
ls *.xxx | while read fn; do mv "${fn}" "${fn/ACDC/AC-DC}"; done
如果您安装了rename
程序:
rename 's/ACDC/AC-DC/' *.xxx