web-dev-qa-db-ja.com

パラメータの順序はtarと関係がありますか?

私はLinuxを学んでいます。 tarballを作成するときにパラメーターの順序が重要であるように見えるのを見て、私は驚きました。

tar -cfvz casual.tar.gz snapback.txt bucket.txt

エラーを出します:

tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

しかし、私がこのようなコマンドを発行した場合:

tar -cvzf casual.tar.gz snapback.txt bucket.txt

tarballはエラーなしで作成されます

この例でパラメータの順序が重要である理由、またはその理由を知るためにその情報をどこで見つけることができるのか、誰かが私に説明できますか?必要なパラメーターcとfを最初に配置し、その後に他のパラメーターを配置するというロジックでエラーを受け取った最初の例と同じように、それを試しました。

Linuxを完全に吸収したいと思います。これには、このようなことが発生する理由の理解も含まれます。前もって感謝します!

17
BitBug

順序が重要かどうかは、オプションをマイナスで始めるかどうかによって異なります

$ tar -cfvz casual.tar.gz snapback.txt bucket.txt
tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

$ tar cfvz casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt

この異常な動作は man page に記載されています

 Options to GNU tar can be given in three different styles.
 In traditional style
 ...
 Any command line words that remain after all options has
 been processed are treated as non-optional arguments: file or archive
 member names.
 ...
 tar cfv a.tar /etc
 ...
 In UNIX or short-option style, each option letter is prefixed with a
 single dash, as in other command line utilities.  If an option takes
 argument, the argument follows it, either as a separate command line
 Word, or immediately following the option.
 ...
 tar -cvf a.tar /etc
 ...
 In GNU or long-option style, each option begins with two dashes and
 has a meaningful name
 ...
 tar --create --file a.tar --verbose /etc

tar(「テープアーカイブ」の略)は、現在の規則が決定する前に存在していたため、互換性のためにさまざまなモードを保持しています。

「Linuxを吸収する」ために、いくつかの最初のレッスンをお勧めします。

  • 常にマニュアルページを読んでください
  • 構文の小さな違いが時々重要です
    • アイテムの位置-ほとんどのコマンドでは、コマンド名の後に最初にオプションを指定する必要があります
    • マイナスが必要かどうか(tarpsのように、最初にマイナスがあるかどうかによって動作が異なります)
    • スペースがオプションであるか、必須であるか、存在してはならないか(xargs -ifooxargs -i fooとは異なります)
  • 期待どおりに動作しないものがある

通常のスタイルで必要な動作を得るには、出力ファイル名をfまたは-fの直後に配置します。

$ tar -cvzf casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt

または:

$ tar -c -f casual.tar.gz -z -v snapback.txt bucket.txt

または、あまり一般的ではないが読みやすいGNU長いスタイルを使用することもできます。

$ tar --create --verbose -gzip --file casual.tar.gz snapback.txt bucket.txt
30
Mikel

Tarのmanページで-fオプションをチェックすると、次のようになります。

 -f, --file ARCHIVE
       use archive file or device ARCHIVE

つまり、-fオプションに続く次のWordがファイルの名前になります。あなたの例では、-fの後に、ファイル名として使用されるvzという文字が続きます。

その後、すべての引数を入力として解析し、vzと呼ばれるファイルに圧縮します。圧縮しようとすると、tarは、圧縮するcasual.tar.gzという名前のファイルがないことに気づき、エラーが発生します。

したがって、-fの後には、作成するファイルの名前を常に付ける必要があります。

7
Kira