答え1
GNUtar(Linuxで一般的)がある場合は、この--transform
オプションを使用できます。
たとえば、現在のコマンドを使用すると、次のディレクトリがあることを確認できます。
$ find . -name '*.c' | xargs tar -rf allcfiles.tar
$ tar tf allcfiles.tar
./b.c
./d/e.c
./a.c
以下を変換することでこれを防ぐことができます。
$ find . -name '*.c' | xargs tar --transform='s!.*/!!' -rf allcfiles.tar
$ tar tf allcfiles.tar
b.c
e.c
a.c
中の表現は--transform
簡単なsed
表現です。これはすべてのディレクトリコンポーネントを削除するだけです。
答え2
find
実装がこのオプションをサポートしている場合は、次のようにディレクトリなしでファイルを削除-execdir
できます。tar
find . -name '*.c' -type f -execdir tar rf $PWD/mytar.tar {} +
tarファイルのパスが絶対パスであることを確認してください。
答え3
POSIX準拠のコマンドのみを使用してこれを行う方法は次のとおりです。
find . -name '*.c' | pax -w -s ',.*/,,' > allcfiles.tar
を使うのが好きなら、tar rf archive ...
右から始める必要があります。空tar
リアルモードではアーカイブが作成されないため、最初からアーカイブしますreplace
。これを行うには、まず次のコマンドを実行して空のTARアーカイブを作成できます。
printf "\000"| dd ibs=10k conv=sync > allcfiles.tar
しかし、私はこのコマンドを好みます:
star cf allcfiles.tar -s ',*/,,' -find . -name '*.c'
これは、そのデータがアーカイブのファイルメタデータを設定するために使用されるため、ファイルごとにstar
一度だけlibfind
呼び出す必要があるため、最速の方法です。stat()
stat
libfind
star