簡體   English   中英

Bash - 如何在子目錄中存檔和壓縮文件,但只能使用特定的文件名

[英]Bash - How can I archive and compress files in subdirectories but only with a certain filename

我有一個目錄結構,看起來像:

main_directory/
    directory1:
        sub_directory1:
            files:
                myfile.txt
                otherfile.txt
        sub_directory2:
            files:
                myfile.txt
                otherfile.txt
        sub_directory3:
            files:
                myfile.txt
                otherfile.txt
        sub_directory4:
            files:
                myfile.txt
                otherfile.txt
    directory2:
        sub_directory1:
            files:
                myfile.txt
                otherfile.txt
        sub_directory2:
            files:
                myfile.txt
                otherfile.txt
        sub_directory3:
            files:
                myfile.txt
                otherfile.txt
        sub_directory4:
            files:
                myfile.txt
                otherfile.txt

我試圖找出(通過反復試驗,因為我不是Linux的專家)如何只在所有目錄中gzip myfile.txt文件。 由於它們在不同的路徑中都具有相同的文件名(沒有辦法解決這個問題),我需要能夠將文件路徑保存在存檔中。 所以我想要創建的最終gzipped tar文件將包含以下內容:

mytar.tar.gz
    main_directory/directory1/sub_directory1/files/myfile.txt
    main_directory/directory1/sub_directory2/files/myfile.txt
    main_directory/directory1/sub_directory3/files/myfile.txt
    main_directory/directory1/sub_directory4/files/myfile.txt
    main_directory/directory2/sub_directory1/files/myfile.txt
    main_directory/directory3/sub_directory2/files/myfile.txt
    main_directory/directory4/sub_directory3/files/myfile.txt
    main_directory/directory5/sub_directory4/files/myfile.txt

有一個簡單的bash方式來做到這一點? 我想我可以寫一個python腳本來做它,但這似乎有點過分。

有人有建議嗎?

這克服了另一個答案中描述的這個問題。

find main_directory/ -name "myfile.txt" | tar -czvf mytar.tar.gz -T -

假設沒有太多文件,您可以執行以下操作:

cd main_directory/..
find main_directory -name "myfile.txt" | xargs tar zcf mytar.tar.gz

如果有大量文件,您可以將文件列表傳輸到文件/流中並將其傳遞給tar。

find main_directory -name "myfile.txt" -print0 | tar zcf myar.tar.gz --null -T -

這將打印出由-print0分隔的文件名( -print0 to find ),並指示tarstdin中正確解析該文件名; 使用空值可確保正確處理目錄中的任何特殊字符

使用足夠新的(4.0.0+我相信)版本的bash(以及許多其他shell),以下內容將起作用:

tar -czf mytar.tar.gz main_directory/**/myfile.txt

如果目錄結構確實是常規的,那么通配符

main_directory/*/*/files/myfile.txt

將匹配您想要的文件。 但是,如果有很多文件,您可能需要恢復find / xargs以避免“參數列表太長”( ARG_MAX )問題。

如果有一個名為myfile.txt文件,你不想包含它們,因為它們的路徑與通配符不完全匹配,那么肯定有辦法將它們從find排除; 或許這個額外的約束應該在問題中說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM