Linux

如何查找特定副檔名的文件並將每個文件 tar 到另一個位置

  • January 16, 2022

我有用於查找特定類型文件並將它們壓縮到單個 tar 存檔並放入其他地方的腳本。但是現在,需求發生了變化,我需要找到某種類型的文件,將其列出並將它們中的每一個壓縮到一個 tar 存檔中,然後將其放到其他地方。目前我正在使用腳本

cd /to/top/of/dir/structure
tar -cf /path/to/tarfile.tar --files-from /dev/null # trick to create empty tar file
find . -type f ! -name '*.log' -print0 | xargs -0 tar -uvf /path/to/tarfile.tar

我從這篇文章中得到的:https ://superuser.com/questions/436441/copy-every-file-with-a-certain-extension-recursive

因此,上面的腳本找到某種文件類型,然後將其歸檔為單個 tar 文件,然後將其放置到另一個位置。但我的問題是,我需要找到某種類型的文件,列出它們,對列出的每個文件進行 tar,然後將它們放到其他位置。

我跟…

cd /to/top/of/dir/structure
find . -type f ! -iname '*.log' -exec gzip -c {} \> /path/to/gzips/\`basename {}\`.gz \;

…但我還沒有測試過。

我真的很懷疑這會是你真正需要的……


編輯

我能弄到什麼程度…

find /path/to/top-level -iname "*.log" -printf "gzip -c %p > /path/to/gzips/%f.gz\n"

…輸出您想要執行的命令。

我仍在努力執行這些命令,缺少-fprint臨時文件,並chmod +x執行*.*

更不用說處理在文件名中轉義尷尬字元的任何問題。


編輯#2

好吧,我不能把它歸結為一行(這是我的挑戰,不是你的),但我可以把它寫成一個相當簡單的腳本:

#!/bin/bash

function compress_file {
 BASENAME=`/bin/basename "$1"`;
 /bin/gzip -c "$1" > /path/to/gzips/$BASENAME.gz;
}

export -f compress_file;
/bin/find /path/to/top-level -iname "*.log" -exec /bin/bash -c 'compress_file "$0"' {} \;
export -fn compress_file;

引用自:https://serverfault.com/questions/471686