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」で終わるファイルを扱う場合は、-name の代わりに -iname を使用することも検討してください。

于 2013-05-26T07:17:21.507 に答える