2012-07-23 43 views
6

我有一個包含文件列表的文本文件。我想要cat他們的內容在一起。做這個的最好方式是什麼?我正在做這樣的事情,但它似乎過於複雜:Bash:從文件列表中刪除多個文件

let count=0 
while read -r LINE 
do 
    [[ "$line" =~ ^#.*$ ]] && continue 
    if [ $count -ne 0 ] ; then 
     file="$LINE" 
     while read PLINE 
     do 
      echo $PLINE | cat - myfilejs > /tmp/out && mv /tmp/out myfile.js 
     done < $file 
    fi 
    let count++ 
done < tmp 

我正在跳過註釋行和遇到問題。必須有更好的方法來做到這一點,沒有兩個循環。謝謝!

+0

子集:http://stackoverflow.com/questions/864316/how-to-pipe-list-of-files - 通過查找命令返回查看所有文件 – 2017-05-10 09:32:09

回答

9

或者在一個簡單的命令

cat $(grep -v '^#' files) > output 
+0

@chepner似乎是asker在做什麼。 – kojiro 2012-07-23 20:08:56

+2

@CharlesDuffy我懷疑這個特定的應用程序會真的使用空格分隔的文件名。而是提出一個改進,因爲在我看來,一個比8行腳本更好的解決方案是一個更好的解決方案。你真的使用空白文件名嗎? – Bernhard 2012-07-25 12:42:51

+3

@Bernhard不要採取這種錯誤的方式,但*當然*我們一直處理帶空格的文件名。我們支持不知道差異的用戶,如果編寫能夠處理它的腳本很容易,他們爲什麼還要這樣呢? – kojiro 2012-07-25 12:47:50

3
{ 
    while read file 
    do 
    #process comments here with continue 
    cat "$file" 
    done 
} <tmp> newfile 
+0

我修復了變量'file'的使用。是否真的需要大括號? – chepner 2012-07-23 19:59:17

+0

@chepner:不,因爲變量的使用是明確的。 – 2012-07-23 20:02:11

1

cat $(cat listoffiles) | grep -v "^#"怎麼樣?

+0

難道你不是指'cat $(grep -v'^#'listoffiles)'?什麼是空白問題? – kojiro 2012-07-23 19:58:06

+0

好的,只要沒有一個文件名包含空格。 – chepner 2012-07-23 20:00:09

+0

@chepner或者只要在'listoffiles'中引用空格或引用了名稱。 – loxaxs 2017-01-09 18:52:42

5
#!/bin/bash 

files=() 
while read; do 
    case "$REPLY" in 
     \#*|'') continue;; 
     *) files+=("$REPLY");; 
    esac 
done < input 
cat "${files[@]}" 

什麼是對這種做法更好的是:

  1. 唯一的外部命令,cat,只有被執行一次。
  2. 爲任何給定的行/文件名保留重要的空白是非常謹慎的。
+0

與此回答相比: cat $(grep -v'^#'files)>輸出 有什麼明顯的優勢嗎? – user1470511 2012-07-23 20:07:39

+3

@ user1470511是的,如果任何文件名中有空格,'grep'答案可能會中斷。 – kojiro 2012-07-23 20:13:41

0

我結束了與此:

sed '/^$/d;/^#/d;s/^/cat "/;s/$/";/' files | sh > output 

步驟:

  1. 的sed刪除空行從文件 &註釋掉線。

  2. sed的然後包裝在cat "";每一行。

  3. 然後腳本被傳送到sh輸出

+0

我忘了提及這是通過將文件名用引號引起來粗暴地處理空格。 – sh3rmy 2017-03-20 22:18:01

0

xargs

printf 'a\nb\n' > files 
printf '12\n3\n' > a 
printf '4\n56\n' > b 
xargs cat < files 

輸出:

12 
3 
4 
56