2015-05-19 55 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