
次のフォルダ構造があります。
/foo
/foo/bar
/foo/bar2
/foo/bar3
すべてのフォルダ(含む/foo
)には名前があります.txt
。ただし、これらのファイルを除いて、/foo
/foo/bar /foo/bar2などにファイルを含めたいと思います。
しかし、これを行うと:
tar cvfz foo.tgz --exclude="/foo/*.txt" /foo
.txt
。さらに、階層全体のすべてのファイルがありません/foo
。
誰でもこれを達成する方法を知っていますか?
答え1
--exclude
globスタイルのパターンのみを許可しているように見えるため、tarのみを使用してこれを実行できるかどうかはわかりません。ただし、findを使用してファイルのリストを取得し、正規表現を使用するgrepを使用してそのファイルをフィルタリングすることはできます。
find foo -type f -print0 | grep -z -v '^foo/[^/]*.txt$' | tar cvf foo.tgz --null -T -
オプション-print0
とは-z
、--null
そのコマンドがレコード(ファイル名)を区切るために改行ではなくNULLバイトを使用することを示します。一部のファイルには予期しない文字が含まれる可能性があるため、これは良い習慣です。