我想將多個子目錄中的一些日志檔案分組到一個新檔案中。問題在于將多個具有完全相同名稱的檔案從多個位置移動到一個位置。
我想使用如下內容,但我需要添加一些內容來在復制時更改檔案的名稱。
find . -name "raml-proxy.log" -exec mv {} raml_log_files/ \;
uj5u.com熱心網友回復:
的位元find和awk可能產生的名單mv,你需要的命令。讓我們首先假設您的日志檔案具有沒有換行符的安靜名稱:
find . -type f -name "raml-proxy.log" |
awk -v dir="raml_log_files" '{s=$0; sub(/.*\//,""); n[$0] ;
printf("mv \"%s\" \"%s/%s.%d\"\n", s, dir, $0, n[$0])}' > rename.sh
然后,仔細檢查 file 后rename.sh,只需執行它。說明:sub(/.*\//,"")從當前記錄中洗掉目錄部分(如果有),包括最后一個/字符。n是一個關聯陣列,其中鍵是日志檔案名,值是一個計數器,每次遇到具有該名稱的日志檔案時都會遞增。演示:
$ mkdir -p a b c d
$ touch a/a b/a c/a d/b
$ find . -type f | awk -v dir="raml_log_files" '{s=$0; sub(/.*\//,""); n[$0] ;
printf("mv \"%s\" \"%s/%s.%d\"\n", s, dir, $0, n[$0])}'
mv "./b/a" "raml_log_files/a.1"
mv "./a/a" "raml_log_files/a.2"
mv "./d/b" "raml_log_files/b.1"
mv "./c/a" "raml_log_files/a.3"
如果日志檔案的名稱中可以有換行符,我們可以使用 NUL 字符作為記錄分隔符,而不是換行符:
find . -type f -name "raml-proxy.log" -print0 |
awk -v dir="raml_log_files" -v RS=$'\\0' '{s=$0; sub(/.*\//,""); n[$0] ;
printf("mv \"%s\" \"%s/%s.%d\"\n", s, dir, $0, n[$0])}' > rename.sh
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/338702.html
