11

我有一个包含文件列表的文本文件。我想把cat它们的内容放在一起。做这个的最好方式是什么?我正在做这样的事情,但它似乎过于复杂:

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

我跳过了注释行并遇到了问题。必须有更好的方法来做到这一点,没有两个循环。谢谢!

4

6 回答 6

18

或者在一个简单的命令中

cat $(grep -v '^#' files) > output
于 2012-07-23T19:59:23.990 回答
6

xargs cat < files

xargs 的优势在于$(cat)cat由于 Linux 的最大命令行长度,它可以扩展到一个巨大的参数列表,如果列表中有很多文件,这些参数可能会失败。

不关心的例子#

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

输出:

12
3
4
56
8
9

#根据 OP 的要求忽略更具体的示例:

printf 'a\nb\n#c\n' > files
printf '12\n3\n' > a
printf '4\n56\n' > b
printf  '8\n9\n' > c
grep -v '^#' files | xargs cat

输出:

12
3
4
56

相关:如何通过管道将 find 命令返回的文件列表传递给 cat 以查看所有文件

于 2017-05-10T09:47:22.537 回答
5
#!/bin/bash

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

这种方法的更好之处在于:

  1. 唯一的外部命令,cat只执行一次。
  2. 为任何给定的行/文件名维护重要的空白是非常小心的。
于 2012-07-23T20:04:50.430 回答
3
{
  while read file
  do
    #process comments here with continue
    cat "$file"
  done
} < tmp > newfile
于 2012-07-23T19:54:40.710 回答
1

怎么样cat $(cat listoffiles) | grep -v "^#"

于 2012-07-23T19:56:10.070 回答
0

我最终得到了这个:

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

脚步:

  1. sed从文件中删除空白行和注释掉的行。

  2. sed然后将每一行包装在cat "and中";

  3. 然后将脚本通过管道传送到sh并输入到output

于 2017-03-20T15:12:40.777 回答