如何連接不同子目錄中的檔案?

如何連接不同子目錄中的檔案?

我有一個大資料夾,其中包含許多子目錄,每個子目錄包含許多.txt檔案。我想將所有這些文件連接到一個.txt文件。我可以對每個子目錄執行此操作cat *.txt>merged.txt,但我嘗試對大資料夾中的所有檔案執行此操作。我該怎麼做呢?

答案1

嘗試與

find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile

遞歸地尋找子目錄f中的所有「*.txt」檔案並將所有檔案連接成一個。/path/to/sourcemergedfile

若要連接其目錄中的每個子目錄文件,請執行以下操作:

find . -mindepth 1 -type d -execdir sh -c 'cat $1/*.txt >> $1/mergedfile' _ {} \;

答案2

如果您使用的是 Bash 並且包含文字檔案的數量(即不超過最大參數數量限制,則限制非常大但不是無限),您可以使用以下功能輕鬆實現此目的globstar

$ shopt -s globstar
$ cat **/*.txt > merged.txt

一種更通用但不太優雅的方法是用作find驅動程式並使其cat在每個檔案上調用,並附加輸出:

$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;

這裡需要調用sh,因為您想要附加每個 的結果cat。確保輸出檔案具有不同的副檔名或位於要合併的樹之外,或者find可以嘗試將輸出與其自身連接。

答案3

如果您必須按特定順序進行串聯,那麼下面的程式碼將按字典順序(按路徑名排序)串聯檔案bash

shopt -s globstar
for name in **/*.txt; do
    [ -f "$name" ] && cat <"$name"
done >merged.out

這類似於find命令

find  . -type f -name '*.txt' -exec cat {} ';' >merged.out

除了順序可能不同之外,將包含到常規文件的符號連結(&& [ ! -L "$name" ]如果不需要,請添加 a),並且將排除隱藏文件(以及隱藏目錄中的文件)(使用shopt -s dotglob將它們添加回來)。

相關內容