3

たくさんの(〜60,000)ファイルが入ったフォルダがあります。それらのほとんどは拡張子「.html.tmp」を持っており、それらすべての「.tmp」部分を削除する必要があります。私はいくつかの同様の解決策を見つけましたが、これを正確に気に入ったものはありませんでした。また、UNIXシェルの基本的な知識しかありません。OSXは「名前の変更」コマンドを提供していません。シェルソリューションが最も便利だと思いますが、他のソリューションも歓迎します。

前もって感謝します。メリアム

4

3 に答える 3

3

最も簡単な解決策は次のようになります。

for f in *.html.tmp; do mv "$f" "${f%.tmp}"; done

これはスペースを正しく処理し、名前を変更するためにファイルごとに個別のシェルを呼び出す必要がないため(Danielの回答のように)、より高速になるはずです。


あなたの質問は、フォルダに最大60kのファイルが含まれていることを示しており、処理が必要なネストされたサブフォルダがないことを示唆しています。しかし、これと同じ位置にいるが、サブフォルダーを再帰的に処理する必要がある場合は、読み進めてください。

Bash 4.xを使用していて、シェルオプションを有効にする場合は、次を使用できます。

shopt -s globstar
for f in **/*.html.tmp; do mv "$f" "${f%.tmp}"; done

オプションが設定された構成**/*.html.tmpは、現在のディレクトリだけでなく、任意のサブディレクトリでも再帰的にglobstar一致することを意味します。*.html.tmp

お使いのバージョンのBashが4.xより古い場合は、再帰的な処理にchepnerのソリューションを使用することをお勧めします。しかし、再帰がまったく必要ない場合、私の最初の答えは最も簡単です。

于 2013-01-22T00:35:57.700 に答える
3

findループを使用して、Danielの;への呼び出しの出力を反復処理します。作成する必要のある個別のプロセスの数を減らすことができるので、より高速になるはずです。

# Instead of calling sh, dirname, and basename for every file, use
# builtin bash commands to process the file name.
find /path/to/your/files -name '*.html.tmp' | while read fname; do
    mv "$fname" "${fname%.tmp}"
done
于 2013-01-22T00:32:02.103 に答える
1

これはあなたが望むことをするはずです:

find /path/to/your/files -name '*.html.tmp' -exec sh -c 'mv -i "{}" "$(dirname "{}")/$(basename "{}" .tmp)"' \;

ファイル名にスペースやその他のシェルメタ文字が含まれていると、単純なソリューションが機能しなくなるため、少し複雑に見えます。私はを使用mv -iしたので、ファイルを上書きする前に尋ねる必要があります。データでこれを試す前に、バックアップを作成することをお勧めします。

于 2013-01-21T21:07:44.027 に答える