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 具有特殊含义的字符,事情就会出错 - 请改用此答案以获得可靠的结果)
cat
con 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
在情况下,你的文件已经存在开关-这追加到该文件,而不是覆盖它,如果它已经存在)