2012-09-18 101 views
2

我正在嘗試使用find命令來搜索多個文件。我想查找文件名中包含特定字符串的目錄中的所有文件,然後tar這些文件。我想在文件名中找到的字符串是日期。如何使用find命令來搜索多個文件

舉例來說,我有一個名爲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; 

} 

回答

3

假設你有GNU焦油(即在Linux,AIX沒有或HP-UX或...):

find . -maxdepth 1 -type f -print0 | grep -z "${DAYTWOPREV}" | tar -cvf archive.tar --null -T /dev/stdin 
+0

當我嘗試這個,它給了我兩個檔案中的相同文件。tar – JonH

+0

如果三個tar文件與您指定的名稱相匹配,那麼這就是正確的行爲。如果你想要所有匹配的名字,除了那些以'.tar'結尾的名字,你必須告訴'find'(或'tar')來排除你想要排除的名字。您可能還需要'-type f'選項(但tar文件無論如何都符合該標準)。 –

+0

''* $ {DAYTWOPREV} *「'位有問題,因爲在雙引號中,shell可能會在擴展到'find'之前擴展它。但是,將它放在單引號中意味着該變量也不會擴展。編輯建議替代方案... – twalberg

3

你可以告訴GNU tar讀取文件到列表從它的標準輸入存檔:

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

-T -是魔; -T表示'從給定文件讀取文件列表',(第二個)-表示'該文件是標準輸入'。 (我加了z選項來壓縮使用gzip文件,並據此命名tar文件,您可能更jbzip2.bz2擴展你會發現你tar支持xz壓縮本身;選項字母爲-J在Mac OS X和BSD,和BSD支持--lzma爲LZMA壓縮。)

此外,與GNU tar,您可以指定選項--null(然後用GNU find使用-print0)來處理甚至文件包含換行符的名字。正如所寫的,如果文件名包含換行符,則會遇到問題;否則,它足夠可靠地運行每行一個文件,空格和所有文件。

+0

獲取... 焦油不能使用多卷壓縮歸檔 嘗試的'tar --help「或'焦油--usage」以獲取更多信息。 – JonH

+0

'-F'與GNU tar完全不同。顯然,如果你可以指定你的版本,這將有所幫助... – twalberg

+0

我誤解了選項信;正如我最初寫的那樣,它是'-T'而不是'-F'。我已經解決了答案的這一方面。 –

0

順便說一下,焦油確實有一個選項(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創建是一個不必要的步驟。但是,我現在還沒有測試的位置)

+0

你應該強調你使用'-r'選項來指向'tar';對您的命令的安全操作至關重要。 (我剛要抨擊你的不安全,但後來注意到'-r'而不是'-c'。) –

0

我只是這樣做:

tar -cf $TARFILE ${DAYTWOPREV}* 
相關問題