如何从Bash中的文件列表中捕获多个文件?

use*_*511 8 bash loops file

我有一个包含文件列表的文本文件.我想把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
Run Code Online (Sandbox Code Playgroud)

我正在跳过评论的行并遇到问题.必须有更好的方法来做到这一点,没有两个循环.谢谢!

Ber*_*ard 13

或者在简单的命令中

cat $(grep -v '^#' files) > output
Run Code Online (Sandbox Code Playgroud)

  • @Bernhard不要采取错误的方式,但*当然*我们一直处理带有空格的文件名.我们支持那些不了解差异的用户,为什么要编写一个可以处理它的脚本呢? (5认同)
  • @CharlesDuffy我怀疑对于这个特定的应用程序,人们真的会使用以空格分隔的文件名.而是提出一个改进,因为在我看来,oneliner是一个比8行脚本更好的解决方案.你实际上使用的是具有空格的文件名吗? (2认同)
  • 如果没有评论:`cat $(cat files) &gt; output` (2认同)

Cir*_*四事件 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
Run Code Online (Sandbox Code Playgroud)

输出:

12
3
4
56
8
9
Run Code Online (Sandbox Code Playgroud)

#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
Run Code Online (Sandbox Code Playgroud)

输出:

12
3
4
56
Run Code Online (Sandbox Code Playgroud)

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


koj*_*iro 5

#!/bin/bash

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

这种方法的优点是:

  1. 唯一的外部命令cat只执行一次.
  2. 为任何给定的行/文件名保持重要的空白非常小心.

  • @ user1470511是的,如果任何文件名中包含空格,则`grep`应答可能会中断. (3认同)