以前のスタイル構文で(GNU)tarの引数の順序は何ですか?

以前のスタイル構文で(GNU)tarの引数の順序は何ですか?

シェルパイプラインでは、ディレクトリ内の選択されたファイルからtarアーカイブを作成し、stdinからファイルリストをインポートしてから、アーカイブをstdoutに書き込みます。私がtarこのように走るとき:

tar cCTf directory - -

すべてが大丈夫です。しかし、次のように実行しようとすると、次のようになります。

tar cTCf - directory -

tarファイルが見つからず、次のエラーメッセージが表示されます。

tar: The following options were used after any non-optional
arguments in archive create or update mode.  These options
are positional and affect only arguments that follow them.
Please, rearrange them properly.
tar: -C ‘directory' has no effect

2番目のコマンドにはどのような問題がありますか?

私はGNU tar 1.34を実行しています。

答え1

このエラーは...

tar:アーカイブ生成モードまたは更新モードでは、オプションではなく引数の後に次のオプションを使用します。これらのオプションは場所によって異なり、その後のパラメータにのみ影響します。正しく並べ替えてください。

tar: -C "ディレクトリ"が無効です。

C...オプションが場所によって異なることを知らせます。表示されるオプションにのみ影響します。後ろにそれ。したがって、afterで書くと、cTCf実際には何もできません。 tar が読み取るファイル名の解釈方法には影響を与えず、それ以降は何も適用できません。-C-T-T

-Tコマンドラインに次のようないくつかのオプションがある可能性があることを考慮すると、理解しやすくなります。-C

tar cCTCTf /path/to/dir1 filelist1 /path/to/dir2 filelist2 -

-Cパラメータは次の-Tパラメータに影響します(以前のパラメータには影響しません)。

答え2

GNU tarが気に入らない場合は、bsdtar目的の構文を使用して目的の操作を実行してください。

$ find . -ls
 13107306    4 drwx--x---   3 user   grp       4096 Aug 30 12:54 .
 13107938    4 drwx--x---   2 user   grp       4096 Aug 30 12:38 ./directory
 13111189    4 -rw-------   1 user   grp         29 Aug 30 12:37 ./directory/a
 13113837    4 -rw-------   1 user   grp         29 Aug 30 12:37 ./directory/b
 13114062    4 -rw-------   1 user   grp         29 Aug 30 12:37 ./directory/c
$ printf "%s\n" a b c | bsdtar cTCf - directory - > output.tar
$ tar tvf output.tar 
-rw------- user/grp        29 2022-08-30 12:37 a
-rw------- user/grp        29 2022-08-30 12:37 b
-rw------- user/grp        29 2022-08-30 12:37 c

関連情報