Bash脚本以递归方式更改文件名

时间:2013-05-25 18:36:33

标签: bash shell

我有一个脚本用于更改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

2 个答案:

答案 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。

相关问题