如何将列表中每个文件的内容复制到另一个文件中?

Ram*_*jaa 15 command-line files filename copy

我在一个名为list_of_files.txt.

我想将该列表中每个文件的内容复制到另一个名为all_compounds.sdf.

我应该如何从命令行执行此操作?

mur*_*uru 20

不要使用简单的命令替换来获取文件名(这很容易被空格和其他特殊字符破坏)。使用类似的东西xargs

xargs -d '\n' -a list_of_files.txt cat > all_compounds.sdf
Run Code Online (Sandbox Code Playgroud)

或者while read循环:

while IFS= read -r file; do cat "$file"; done < list_of_files.txt > all_compounds.sdf
Run Code Online (Sandbox Code Playgroud)

要安全地使用命令替换,至少设置IFS为换行符并禁用通配符(通配符扩展):

(set -f; IFS=$'\n'; cat $(cat list_of_files.txt) > all_compounds.sdf)
Run Code Online (Sandbox Code Playgroud)

周围的括号()将在子 shell 中运行它,以便您当前的 shell 不受这些更改的影响。


Zan*_*nna 14

快速而肮脏的方式......

cat $(cat list_of_files.txt) >> all_compounds.sdf
Run Code Online (Sandbox Code Playgroud)

请注意:这仅在您列表中的文件名表现良好时才有效 - 如果它们有空格、换行符或任何对 shell 具有特殊含义的字符,事情就会出错 - 请改用此答案以获得可靠的结果)

笔记

  • catcon cat生成文件。它还打印它们的内容。

  • 使用命令替换,command2 $(command1)您可以将command1( cat list...)的输出传递到连接文件的command2( cat)。

  • 然后使用重定向>>将输出发送到文件而不是打印到标准输出。如果要查看输出,请tee改用:

      cat $(cat list_of_files.txt) | tee -a all_compounds.sdf
    
    Run Code Online (Sandbox Code Playgroud)

(我用>>的不是>,并tee-a在情况下,你的文件已经存在开关-这追加到该文件,而不是覆盖它,如果它已经存在)

  • @Serg 如果未进行分词,则 `cat` 将整个列表作为一个参数。 (4认同)