2

Linux サーバー上の一連のファイルの名前を変更しようとしています。必要なファイルを見つけるのは簡単です。

find . -type f -wholename \*.mbox

もちろん、mbox ファイルであるため、名前にスペースが含まれているものもあるため、次のようになります。

find . -type f -wholename \*.mbox -print0

ファイルの名前を変更できるように、xargs にパイプしています。

find . -type f -wholename \*.mbox -print0 | xargs -0 -I{} echo ${"{}"/.mbox/}

INBOX.mbox を指定すると、エコーは INBOX のようなものを返すはずですが、bash は次のように文句を言います。

bash: ${"{}"/.mbox/}: bad substitution

どうすればこれを修正できますか? 可能であれば、それを find/xargs ソリューションに保持して、その周りに多くのループ構造を追加しないようにしたいと思います。

4

6 に答える 6

8

試す

find . -type f -wholename \*.mbox | sed 's/\(.*\)\.mbox/mv "\1.mbox" "\1"/' | sh

一部のファイルに二重引用符が含まれている場合、これは100%絶対確実ではありませんが、無視できると思います:)

于 2009-05-06T18:17:43.927 に答える
2

GNU Parallel http://www.gnu.org/software/parallel/には、拡張子を削除する {.} があります。

find . -type f -wholename \*.mbox -print0 | parallel -0 mv {} {.}

ファイル名に \n が含まれていないことがわかっている場合は、これも機能します。

find . -type f -wholename \*.mbox | parallel mv {} {.}
于 2010-06-10T18:55:05.130 に答える
1

あなたが試すことができます:

find . -type f -wholename \*.mbox -print0 | sed 's/\.mbox//'

あなたの問題は、xargsにパイプしようとすることです。その時点で"{}"は何の意味もありません。

ファイルの名前を変更するには(bashを使用していると仮定します)

find . -type f -wholename \*.mbox -print0 | \
    while read I ; do
        mv $I $(echo $I | sed 's/\.mbox//') ;
    done ;
于 2009-05-06T14:58:14.530 に答える
1

私はあなたがこれを必要とすると思います:

find . -wholename \*.mbox | awk '{new=$0; gsub("\.mbox$", "", new) ; system("mv \"" $0 "\" \"" new "\"") }'

(gawkとmawkの両方と互換性があり、mawkでテストされている必要があります)。xargsは使用しませんが、移動するファイルごとに新しいプロセスをフォークするわけではないことに注意してください。大量のファイルを移動する必要がある場合は、その利点に気付くでしょう。警告:ファイルのいずれかに名前に改行が含まれていると、問題が発生します(ただし、これが問題である場合は、神があなたと共におられます)。

rmxargsを使用して、1回の呼び出しで複数のファイルを削除することにより、このソリューションをさらに強化します。

本当にスピードが必要な場合は、awkの代わりにpythonスクリプトを使用することをお勧めします。それはrm単一のフォークなしですべてを行います。

于 2009-05-06T19:09:17.390 に答える
0

ほら、これでうまくいくはずです....

# find .
.
./test.tst
./test1.tst
./test2.tst
./test/test4.tst
./test/test5.tst

#

for file in `find . -type f`
do
mv $file ${file%.tst}.new
done

# find .
.
./test
./test/test4.new
./test/test5.new
./test1.new
./test2.new
于 2010-03-02T15:47:41.317 に答える