Bash

連接目錄中的 1000 個文件

  • May 26, 2015

我知道我們可以通過cat file [file] [[file] ...] > joined-file. 我有包含大量文件的目錄。我想將它們全部連接起來。我想連接 1000 個文件,而不管它們的名稱和順序如何。這是我嘗試過的

for i in /var/abc/*.csv; do "$i" > file1.csv ; rm -rf "$i";done

但要跟踪計數另一個變數。什麼可以是有效的方法?這樣我就不能直接連接 1000 個文件並移動它們。

編輯 Why 1000,因為該目錄包含十萬個文件。所以文件的大小很重要。我已經用你的答案試過了。

cd /var/abc 
for file in $(ls -p | grep -v / | tail -1000);do cat "$file" >>"/var/abcd/xigzag"$tick".csv" && rm -rf "$file";done

你不需要循環,你可以告訴cat讀取所有文件:

cat /var/abc/*.csv > file1.csv && rm /var/abc/*.csv

只要文件不多(但限制很大)。

在兩個命令之間使用&&可確保僅在成功“複製”文件時才刪除文件。

不過有幾點需要注意:

  • 您不能在與要連接的原始文件相同的文件夾中執行它,否則rm將刪除聚合併且您將失去所有內容;
  • 如果新的 CSV 文件出現在’ 參數的開頭cat和擴展之間,它們將被刪除而不被複製。rm

要一次連接 1000 個文件(因此每 1000 個原始 CSV 生成一個 CSV),您可以在目標目錄中按如下方式處理任意數量的文件:

find /var/abc -maxdepth 1 -type f -name \*.csv | split -d -l 1000 - csvlists
for file in csvlists*; do cat $(cat $file) > concat${file##csvlists}.csv && rm $(cat $file); done

這將找到/var/abcnamed中的所有文件,並在以( , …)*.csv開頭的文件中一次列出 1000 個文件。然後循環讀取每個文件列表並將列出的 CSV 文件連接到名為etc. 的文件中以匹配列表。複製每組文件後,將刪除原始文件。csvlists``csvlists00``csvlists01``for``concat00.csv

此版本假定 CSV 文件的名稱不包含空格、換行符等。

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