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\*rar
unrarプログラムは、ユーザーが入力したときにテキスト文字列を受け取りますfile*rar
。と入力する方が簡単でunrar x file*rar
、シェルはパターンを拡張します(unrar
パターンと一致するファイルのリストを受け取ります)。
さて、unrar x file\*rar
例えばうまくいかないのはなぜunrar x file\*.rar
ですか?私の考えには、unrar
パターン拡張を実行する独自のコードが含まれており、シェルがそれを実行していないシステムで実行され、ルールがUnixとは異なるということです。私の記憶が正しいなら、これはMS-DOSの規則に従うこと*rar
です。いいえ名前が.で終わるファイルと一致します.rar
。