2

スペースやその他のスクリプト改行文字を含むファイルの名前を変更しようとしています。

プラットフォームは Ubuntu サーバー 12 (Bash 4 を使用) であり、「rename」コマンドのすべてのインスタンスは Prename 別名 Perl Rename を参照します。

適切な正規表現を書くのに問題があるか、find コマンドから有効な変数を作成するのに問題があります。

これが私の成熟した名前のテストデータです(すべてのファイル、ディレクトリなし):

/test/-poop
/test/poopfile.txt
/test/po_________!!!!!!!! $$^^^   op.sh

(編集) 期待される出力: ファイル名を次のように変更したい

/test/poop
/test/poopfile.txt
/test/po_op.sh

(/編集)

/test でこのコマンドを実行すると:

find * -type f -exec rename -n 's/[^a-zA-Z0-9-_.]/_/g; s/_+/_/g' {} \;

私はもちろん得ます:

find: unknown predicate `-poop'

だから私は物事を変更しました:(find * -> find . findコマンドの結果が./で始まるように)

find . -type f -exec rename -n 's/[^a-zA-Z0-9-_.]/_/g; s/_+/_/g' {} \;

どちらが返されますか

./-poop renamed as ._-poop
./poopfile.txt as ._poopfile.txt
./po_________!!!!!!!! $$^^^   op.sh renamed as ._po_op.sh

それは良くないね。私の正規表現は私が言ったことを正確に実行したため、すべてのファイルに _ というプレフィックスが付けられました。先頭に「-」が付いているファイルに対処する必要がなければ問題ありませんが、このスクリプトで処理しようとしているのはまさにそのようなことです。

これは私が立ち往生している場所です-正規表現を行の最初の2文字、または「./」の最初のインスタンスのいずれとも一致させないようにする方法がわかりません

^.{2} ## matches the first two characters in the string
^./   ## matches the ./ at the start of the line (assuming I change my delimiter from /)

しかし、「文字列の最初の 2 文字ではなく、[a-zA-Z0-9.-_] 内の文字ではないもの」とはどのように言えばよいでしょうか?

また

私はこれを完全に間違っていますか?find コマンドの結果を名前変更スクリプトに渡して、先頭の「-」によって検索が barf にならないようにする方法はありますか?

実際にそれらの行について考えています-私はこれを書きました:

for f in $( find . -type f ); do
    p=$( printf "%s\n" "$f" | sed 's/^..//' );
    rename -n 's/[^a-zA-Z0-9-_.]/_/g; s/_+/_/g' "$p";
done

結果:

Unknown option: p
Unknown option: o
Unknown option: o
Unknown option: p
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

そのため、「-poop」に名前を変更するために「-poop」を手に入れることができたとしても、先頭のハイフンをいじっています。

答えは正規表現にあると確信しています。

提供できるガイダンスに非常に感謝しています!これが私の最初の質問です。間違いやエチケットの間違いがありましたらお知らせください。正規表現に関する私の知識が乏しいことは十分承知していますが、質問をしないことがばかげた行動方針になるという点に到達したと思います。

4

1 に答える 1

3

を使用しrename -n -- $regex $filenamesます。

ここで重要なのは です--。これは、「オプションはここで終わり、ファイル名はここで始まる」と言う広く使用されている方法です。findそれ自体はサポートしていませんが、サポートしてrenameいます。

ここにいくつかの詳細があります。

于 2012-05-29T12:01:44.290 に答える