我想将整个文件的内容按组复制到其他多个文件中。假设我选择 10 个 .txt 文件,那么这些文件的内容应该复制并粘贴到另一个新文件中。所有这些文件都位于同一目录中。
我想对多个文件 (<2000) 执行此操作。因此无法手动执行。
答案1
您的问题需要澄清。我认为可能有两种情况:
复制多个到一个:
for file in directory/*.txt; do cat "$file" >> someotherdir/combined.txt; done
多对多复制:
for file in directory/*.txt; do cp "$file" someotherdir/"$( basename "$file" )".copy ; done
在每个示例中,我们都在查看directory
当前位置中命名的目录(使用pwd
命令检查)。因此,如果我在/home/foo_user
我们正在查看/home/foo_user/directory
。 glob*.txt
将匹配所有以.txt
结尾的文件。目标目录someotherdir
也将相对于您的当前位置进行引用。提供完整路径,例如,/home/foo_user/someotherdir/anotherdir
如果您想复制到特定位置。在第一个示例中,我们使用cat
并将>>
所有文件的内容附加到单个文件中。在另一个示例中cp
,将每个文件的副本复制到新文件名,这将取出变量中当前的文件名称 "$file"
并附加到.copy
它。
请注意,如果命名并不重要,我们可以将第二种情况简化为仅创建新目录并通过以下方式递归复制它cp -r
:
mkdir copies
cp -r original_dir/ copies/
因此可以使用第一种情况来完成,cat dir/*.txt > combined.txt
但是当您处理大量文件并且可能遇到Argument list too long
错误时,循环是更好的选择,而 shell 循环不会受到影响。
无需了解具体细节,这两种解决方案应该足以应对多种情况。请根据您的具体情况进行调整。
答案2
要将 file1.txt 中的所有内容复制到 file2.txt,请使用以下代码:
cp file1.txt file2.txt
如果您知道所有输入和输出文件的名称,则可以使用循环:
#!/bin/bash
input=(input1.txt input2.txt inputn.txt)
output=(output1.txt output2.txt outputn.txt)
i=0
while (i<="${input#[@]}")
do
cp "${input[i]}" "${output[i]}"
i++
done
不过,这大部分取决于具体情况。