ファイルのバックアップ等で,特定のパターンに合致するファイルだけを tar アーカイブに含める際によく使う方法を Tipsとしてまとめました
ポイント
- tar コマンドの--files-from=FILE (省略形は -T FILE )を使う
- stdin からファイル一覧を与える場合は tar コマンドに--files-from=- (省略形は -T - )を付ける
- あとは find などと組み合わせればOK
- ファイル名にスペースが含まれる場合などは find -print0 | tar cf hogehoge.tar -T - --null などと工夫すれば良い
tar の --files-from=FILE (-T FILE)オプションについて
tar コマンドにファイル名の一覧を渡すには "--files-from=FILE" または "-T FILE" オプションを使う
"--files-from=-" や "-T -" を指定すれば stdin (標準入力)からファイル名の一覧を受け取ることも出来る
ファイル名の区切り文字はデフォルトでは LF
"--null"オプションを使うと NULキャラクタを区切り文字とすることができる
利用例 (findの出力を tarコマンドに渡す)
$ find /path/to -type f -print0 | tar cf hogehoge.tar -T - --null
findコマンドで抽出したファイルだけを tar コマンドに渡してアーカイブする
ファイル名に全角文字や,空白文字が含まれている場合でも,
- findに -print0 オプションを付ける
- tarに --null オプションを付ける
だけでOK
利用例 (テキストファイルからファイル一覧を読み込む)
$ find /path/to -type f > list.txt $ tar cf hogehoge.tar --files-from=list.txt
パイプ処理が苦手な人は,一度テキストファイルにファイル一覧を出力,それを --files-from でtarコマンドに渡せばOK
利用例 (特定のパターンに合致するファイルは除外して tar アーカイブを作成する)
$ find /path/to -type f > list.txt $ grep -v ".o$" list.txt > filtered.txt $ tar cf hogehoge.tar --files-from=filtered.txt
利用例 (特定のパターンに合致するファイルだけの tar アーカイブを作成する)
ソースコードのアーカイブ,例えば拡張子が .c または .cpp のファイルだけを tarアーカイブに含める場合は
$ find -name "*.c" -o -name "*.cpp" -print0 | tar cf hogehoge.tar -T - --null
と書くことができる
$ find -name "*.c"
で拡張子が .c のみ
$ find -name "*.c" -o -name "*.cpp"
で拡張子が .c のみ,または(or条件だから "-o" ) 拡張子が .cpp のファイルをまとめて抽出している