连接一个目录中的 1000 个文件

Aas*_*shu 0 ls shell bash sed cat

我知道我们可以通过cat file [file] [[file] ...] > joined-file. 我有包含很多文件的目录。我想连接所有这些。我想连接 1000 个文件,而不管它们的名称和顺序。这是我尝试过的

for i in /var/abc/*.csv; do "$i" > file1.csv ; rm -rf "$i";done
Run Code Online (Sandbox Code Playgroud)

但要跟踪计数另一个变量。什么可以是有效的方法?这样我就不能直接连接 1000 个文件并移动它们。

编辑 为什么是 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
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 5

你不需要循环,你可以告诉cat读取所有文件:

cat /var/abc/*.csv > file1.csv && rm /var/abc/*.csv
Run Code Online (Sandbox Code Playgroud)

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

&&在这两个命令之间使用可确保文件只有在成功“复制”后才会被删除。

不过有几个注意事项:

  • 您不能在与要连接的原始文件相同的文件夹中运行它,否则rm将删除聚合并且您将丢失所有内容;
  • 如果新的 CSV 文件出现在 的开始catrm的参数扩展之间,它们将被删除而不会被复制。

要一次连接 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
Run Code Online (Sandbox Code Playgroud)

这将找到/var/abcnamed 中的所有文件*.csv,并在以csvlists( csvlists00, csvlists01... )开头的文件中一次列出 1000 个。然后for循环读取每个文件列表并将列出的 CSV 文件连接到名为concat00.csvetc.的文件中以匹配列表。复制每组文件后,原始文件将被删除。

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

  • 虽然我建议不要在`/var/abc` 中运行它...... (2认同)