2

find コマンドを使用して複数のファイルを tar しようとしています。ファイル名に特定の文字列を含むディレクトリ内のすべてのファイルを検索し、それらのファイルを tar したいと考えています。ファイル名で見つけたい文字列は日付です。

たとえば、ulog.20120914.log という名前のファイルがあります。

私が今していることは次のとおりです。

DAYTWOPREV=`date +%Y%m%d --date='2 days ago'`

function archive {
    cd $1;
    if [ ! -d archive ]; then
        mkdir archive;
    fi

TMPFILE=`mktemp`;
    find . -maxdepth 1 -name "${DAYTWOPREV}*" -type f -print0  > $TMPFILE;


    TARFILE=archive/${DAYTWOPREV}$2.tar;
    if [ ! -e $TARFILE ]; then
        echo tar cfT $TARFILE /dev/null;
        tar cfT $TARFILE /dev/null;
    fi  

cat $TMPFILE | xargs -0r tar rf $TARFILE
    cat $TMPFILE | xargs -0r rm -rf
    rm -f $TMPFILE;

}
4

4 に答える 4

3

tar標準入力からアーカイブするファイルのリストを読み取るように GNU に指示できます。

find . -maxdepth 1 -name "${DAYTWOPREV}*" -type f | tar -czf archive.tar.gz -T -

これ-T -が魔法です。-Tは「与えられたファイルからファイルリストを読み取る」を意味し、(2番目)-は「ファイルが標準入力であること」を示します。(私はz、ファイルを圧縮するオプションを追加し、gzipそれに応じて tar ファイルに名前を付けました。拡張機能を使用することjをお勧めします。ネイティブで圧縮をサポートしていることに気付くかもしれません。オプション文字はMac OS X および BSD にあります。また、BSD はLZMA 圧縮をサポートしています。 .)bzip2.bz2tarxz-J--lzma

また、 GNUtarを使用すると、オプション--null(および GNU finduseを使用-print0) を指定して、改行を含むファイル名も処理できます。書かれているように、ファイル名に改行が含まれていると問題が発生します。それ以外の場合は、1 行に 1 つのファイルが十分に確実に機能し、スペースもすべてです。

于 2012-09-18T15:23:12.560 に答える
3

GNU tar があると仮定します (つまり、AIX や HP-UX などではなく、Linux 上で):

find . -maxdepth 1 -type f -print0 | grep -z "${DAYTWOPREV}" | tar -cvf archive.tar --null -T /dev/stdin
于 2012-09-18T15:27:22.410 に答える
0

ちなみに、tarには、これらの他のソリューションのいくつかで「tarの複数の呼び出し」の問題を修正するオプション(rの代わりに)があります。c

find . -maxdepth 1 -name '*20120914*' -exec tar rvf archive.tar {} +

find . -maxdepth 1 -name '*20120914*' -print0 | xargs -0 tar rvf archive.tar

実際、あなたはすでにそれを使用しているようです。既存のソリューションに欠けているものは何ですか? (それ以外 - 実際に tar ファイルが存在する必要はないと思うので、/dev/null の作成は不要なステップです。しかし、私は今のところテストする立場にありません)

于 2012-09-18T15:43:27.353 に答える
0

私はこれを行うだけです:

tar -cf $TARFILE ${DAYTWOPREV}*
于 2012-09-18T15:52:48.087 に答える