tar -Cとワイルドカードファイルパターン


17

tarコマンドを使用してディレクトリを変更し、ワイルドカードファイルパターンを使用できますか?

これが私がやろうとしていることです:

tar -cf example.tar -C /path/to/file *.xml

ディレクトリ(-C)を変更しなくても機能しますが、tarファイルの絶対パスを避けようとしています。

tar -cf example.tar /path/to/file/*.xml

私が行った他の試みのいくつかを以下に示します。

tar -cf example.tar -C /path/to/file *.xml
tar -cf example.tar -C /path/to/file/ *.xml
tar -cf example.tar -C /path/to/file/ ./*.xml
tar -cf example.tar -C /path/to/file "*.xml"

そして、これは私が得るエラーです:

tar: *.xml: Cannot stat: No such file or directory

この作業を行う方法は他にもあります(find、xargsなどを使用)が、tarコマンドだけでこれを実行したいと思っていました。

何か案は?

回答:


18

問題は、*。xmlがtarではなくシェルによって解釈されることです。したがって、見つかったxmlファイル(存在する場合)は、tarコマンドを実行したディレクトリにあります。

必要なファイルを選択し、それらをtarするために、多段階操作(おそらくパイプを含む)を使用する必要があります。

最も簡単な方法はcd、ファイルがあるディレクトリに移動することです。

$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)

動作するはずです。

括弧はコマンドをグループ化するため、コマンドが終了しても元のディレクトリに残ります。&&は、tarイニシャルcdが成功した場合にのみ実行されることを意味します。


9

あなたの試みの一つで:

tar -cf example.tar -C /path/to/file "*.xml"

*文字は実際にtarに渡されます。ただし、問題はtarがアーカイブのメンバーの名前のワイルドカードマッチングのみをサポートすることです。そのため、アーカイブからメンバーを抽出または一覧表示するときにワイルドカードを使用できますが、アーカイブを作成するときにワイルドカードを使用することはできません。

そのような状況では、私はしばしば(すでに述べたように)見つけることに頼ります。GNU findがある場合、-printfオプションを使用して、相対パスのみを印刷する素晴らしいオプションがあります。

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.