2012-07-23 49 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