シェルパイプラインでは、ディレクトリ内の選択されたファイルから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