なぜこの式をunrar拡張できないのですか?

なぜこの式をunrar拡張できないのですか?

file1.rar同じディレクトリに、file2.rarおよび3つのRARファイルがありますfile3.rar。拡張機能を使用して1つのコマンドでファイルを抽出したいと思います。アスタリスクは、などのパラメータunrarからunzipエスケープする必要があることを覚えておいてください7z

私は次のコマンドを試しました。

unrar x file\*rar

結果:

UNRAR 5.00 beta 8 freeware      Copyright (c) 1993-2013 Alexander Roshal

No files to extract

ただし、このコマンドは機能します。

unrar x file\*

このコマンドは機能します:

ls file*rar

結果は次のとおりです。

file1.rar file2.rar file3.rar

それでは、最初のコマンドが機能しないのはなぜですか?

答え1

unrar x '*.rar' 

これは私にとって効果的で、同じ問題がありました。

'を省略すると、unrarは同じコマンドラインにすべてのファイルを追加しようとします。

例: 1.rar 2.rar 3.rar がある場合

unrar x *.rar

Linuxに渡されるコマンドは次のとおりです。

unrar x 1.rar  2.rar 3.rar 

エラーが発生しますが、これを使用すると、

unrar x '*.rar' 

渡されるコマンドは次のとおりです。

unrar x 1.rar
unrar x 2.rar
.......

答え2

5.2.7(最新バージョン)でも機能しません。一度試してみて、以前のunrar x file\*.rarことを記録しておくことをお勧めしますrar。少なくとも5.2.7ではコードパスがわずかに異なり、5.2.7では動作します。

なぜ?まあ、unrarのソースコードを数分間検索して(match.cpp試してみたい場合は確認してください!)「Alexander Roshalは本当に、本当に本物glob(3)「代わりに」を使用する必要があります。なぜそうではないのですか?それはおそらく、AFAIKのrarであるWindowsでは利用できないからです。

Windowsでは、拡張子は特別で、コードはunrar拡張子を実際にファイル名の一部ではなくファイル名の一部として扱うようです。単純な最後の末尾の拡張子は*1つと一致しますが、*中間aは一致しません。これがWindowsで予想される動作であるかどうかはわかりませんが、Unixでは確かにそうではありません。


解決策

そのような破損を処理する賢明な方法は次のとおりです。

for f in file*rar; do
    unrar x "$f"
done

シェルがglobを展開し、一度に1つのファイルを解凍します。ファイル*名に以下が含まれていないことを願っています...


私は最初は5.2.7で動作すると言いましたが、間違っていました。テスト中にバックスラッシュを失いました...

答え3

unrar x file\*rarunrarプログラムは、ユーザーが入力したときにテキスト文字列を受け取りますfile*rar。と入力する方が簡単でunrar x file*rar、シェルはパターンを拡張します(unrar パターンと一致するファイルのリストを受け取ります)。

さて、unrar x file\*rar例えばうまくいかないのはなぜunrar x file\*.rarですか?私の考えには、unrarパターン拡張を実行する独自のコードが含まれており、シェルがそれを実行していないシステムで実行され、ルールがUnixとは異なるということです。私の記憶が正しいなら、これはMS-DOSの規則に従うこと*rarです。いいえ名前が.で終わるファイルと一致します.rar

関連情報