2015-05-19 35 views
0

读取文件的列表后,我有与filesList.txt其中包含需要合并到单个文件中的所有文件的列表中的名称文件。猛砸合并多个文件到单个文件从其他外部文件

filesList.txt 
------------------ 
../../folder/a.js 
../../folder/b.js 
../../folder/c.js 
../../folder/d.js 

当前我正在运行以下命令。

cp filesList.txt filesList.sh 
chmod 777 filesList.sh 
vim filesList.sh 
cat 
../../folder/a.js 
../../folder/b.js 
../../folder/c.js 
../../folder/d.js 
> output.txt 

启动Vim命令j10使上述多文件转换成单行这样

cat ../../folder/a.js ../../folder/b.js ../../folder/c.js ../../folder/d.js > output.txt 

保存和使用:wq VIM内退出文件并运行./fileList.sh创造完全相同的单output.text文件为了文件列出英寸

我的问题是什么命令,我需要用它来创建其创建的文件外部列表一个bash文件(filesList.txt)逐行生成单个文件及其内容。所以我不需要每次需要合并文件时将我的filesList.txt文件转换为filesList.sh文件。

+0

你真的需要让这个文件以行分隔而不是NUL分隔吗? (对于UNIX上的文件列表,这是一个非常糟糕的选择,因为UNIX文件名可以包含换行符)。 –

回答

3

面向行的文件是一个不错的选择在这里(在坏意义上的“谁可以控制文件名可以将任意文件到您的输出的任何攻击”;你可能不希望冒险,有人谁数字如何创建新的文件.js符合您的glob则可以通过创建../../$'\n'/etc/passwd$'\n'/hello.js介绍/etc/passwd到列表)。相反,通过完全无效不同的值,并且使用xargs -0(非POSIX扩展,但主要的操作系统厂商提供了一个流行的一种)转换成那些论据。

printf '%s\0' ../../folder/*.js >filesList.nsv # generate file w/ null-separated values 
xargs -0 cat <filesList.nsv >output.txt  # combine to argument list split on NUL 

顺便说一句,如果你想递归地生成文件列表,即第一部分将成为:

find ../../folder -name '*.js' -print0 >filesList.nsv 

...如果你没有任何其他需要filesList.nsv ,我只是避免它完全和直接生成output.txt

find ../../folder -name '*.js' -exec cat '{}' + >output.txt 

如果必须使用换行,但你有GNU xargs的,至少使用xargs -d $'\n'来处理他们尽量避免在bash库存xargs的或比较幼稚的做法找到其他引用相关的错误:

printf '%s\n' ../../folder/*.js >filesList.txt # generate w/ newline-separated values 
xargs -d $'\n' cat <filesList.txt >output.txt # combine on those values 

如果你没有GNU xargs,那么你可以在shell中自己实现:

# Newline-separated input 
while IFS= read -r filename; do 
    cat "$filename" 
done <filesList.txt >output.txt 

# ...or NUL-separated input 
while IFS= read -r -d '' filename; do 
    cat "$filename" 
done <filesList.txt >output.txt 
+0

感谢您指出正确的方式来做到这一点。我删除了我的答案。谦虚〜!〜。 – rahul

+0

filesList.nsv正在提供 - 在这里这个文件中列出的文件的顺序是重要的合并。因此,递归扫描目录/ – Developer

+0

并不是一个好主意,并且出于安全角度,这仅在本地服务器上运行。 – Developer