Shell-Script

將多個子目錄中的多個文件合併為每個子目錄1個文件並刪除原始文件

  • January 15, 2021

我有一個目錄結構

DIR
       SUBDIR1
                   11-01-11.txt
                   13-05-23.txt

       SUBDIR2
                   12-05-56.txt
                   13-04-02.txt
                   15-04-06.txt

我想寫一個 bash 腳本,導致這個Desired 輸出

DIR
       SUBDIR1
                   sub_dir1_merged.txt

       SUBDIR2
                   sub_dir2_merged.txt

我想維護原始目錄結構,將文件合併到每個 sub_dirname_merged.txt 文件中,並刪除所有原始文件。

我嘗試了以下程式碼

for f in */
do
cat $f/*.txt > "$f"/$f_merged.txt
rm $f/*.txt 
done

這並不完全有效。

劇本:

for f in */*.txt; do 
 cat "$f" >> "$(dirname "$f")/$(dirname "$f")_merged.txt" 
 rm "$f"
done

在子目錄中循環 txt 文件:

for f in */*.txt; do 

$(dirname "$f")

返回 txt 所在文件夾的名稱,用於命名文件和保存文件的路徑。


rm "$f"

刪除文件。當您要使用rm命令時,請確保腳本的結果是您在執行它之前所期望的。

您可以與標誌find結合使用。-execdir它變得像下面這樣簡單:

find DIR/ -type f -execdir bash -c 'cat -- $1 >> "${PWD##*/}_merged.txt"' _ {} \;

我稍微修改了上面的單行,所以原始文件被刪除了。

find DIR/ -type f -execdir bash -c 'for f; do cat -- $f >> "${PWD##*/}_merged.txt"; done;  [[ $f != *${PWD##*/}* ]] && rm -v "$f"' _ {} \;

引用自:https://unix.stackexchange.com/questions/629370