我有一个脚本用于更改mht文件的文件名,但它不会遍历dirs和sub dirs。我在当地论坛上问了一个问题,我得到了一个答案:这是一个解决方案:
find . -type f -name "*.mhtml" -o -type f -name "*.mht" | xargs -I item sh -c '{ echo item; echo item | sed "s/[:?|]//g"; }' | xargs -n2 mv
但它会产生错误。通过我的一些实验,结果发现sh -c
使用空格中断文件名,这会产生错误。我该如何解决这个问题?
#!/bin/bash
# renames.sh
# basic file renamer
for i in . *.mht
do
j=`echo $i | sed 's/|/ /g' | sed 's/:/ /g' | sed 's/?//g' | sed 's/"//g'`
mv "$i" "$j"
done
答案 0 :(得分:2)
#! /bin/bash
find . -type f \( -name "*.mhtml" -o -name ".mht" \) -print0 |
while IFS= read -r -d '' source; do
target="${source//[:?|]/}"
[ "X$source" != "X$target" ] &&
mv -nv "$source" "$target"
done
更新:根据原始问题重命名,并添加对.mht
的支持。
答案 1 :(得分:1)
使用rename
。通过重命名,您可以指定重命名模式:
find . -type f \( -name "*.mhtml" -o -name "*.mht" \) -print0 | xargs -0 -I'{}' rename 's/[:?|]//g' "{}"
这样您就可以正确处理带空格的名称。 xargs将使用find命令提供的每个文件名替换{}。另请注意-print0和-0的使用。这使用\ 0作为分隔符,因此避免了处理包含\ n(换行符)的电影名称的问题。
-o没有像预期的那样工作。你必须使用括号来分组条件。
如果您处理以“.mHtml”结尾的文件,您也可以考虑使用-iname而不是-name。