0

我有一个用于更改 mht 文件的文件名的脚本,但它不会遍历目录和子目录。我在当地论坛上问了一个问题,得到的答案是这是一个解决方案:

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
4

2 回答 2

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.

于 2013-05-25T18:42:45.740 回答
1

使用rename. 使用 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。

于 2013-05-26T07:17:21.507 回答