
我有一個大資料夾,其中包含許多子目錄,每個子目錄包含許多.txt
檔案。我想將所有這些文件連接到一個.txt
文件。我可以對每個子目錄執行此操作cat *.txt>merged.txt
,但我嘗試對大資料夾中的所有檔案執行此操作。我該怎麼做呢?
答案1
嘗試與
find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile
遞歸地尋找子目錄f
中的所有「*.txt」檔案並將所有檔案連接成一個。/path/to/source
mergedfile
若要連接其目錄中的每個子目錄文件,請執行以下操作:
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
將它們添加回來)。