unix:如何连接grep中匹配的文件

unix:如何连接grep中匹配的文件,unix,grep,cat,Unix,Grep,Cat,我想连接名称中不包含“\u BASE\u”的文件。我以为它会在……的某个地方 ls | grep -v _BASE_ | cat > all.txt 猫的部分是我没有弄对的。有人能告诉我一些关于这个的想法吗?试试这个 ls | grep -v _BASE_ | xargs cat > all.txt 您可以使用--ignore选项,使用ls忽略某些文件,然后将它们放入文件中 ls --ignore="*_BASE_*" | xargs cat > all.txt 您也可

我想连接名称中不包含“\u BASE\u”的文件。我以为它会在……的某个地方

ls | grep -v _BASE_ | cat > all.txt
猫的部分是我没有弄对的。有人能告诉我一些关于这个的想法吗?

试试这个

ls | grep -v _BASE_ | xargs cat > all.txt

您可以使用
--ignore
选项,使用
ls
忽略某些文件,然后将它们放入文件中

ls --ignore="*_BASE_*" | xargs cat > all.txt 
您也可以在不使用xargs的情况下执行此操作:

cat $( ls --ignore="*_BASE_*" ) > all.txt
UPD: Dale Hagglund注意到,类似“Some File”的文件名将显示为两个文件名,“Some”和“File”。为了避免这种情况,您可以使用
--quoting style=WORD
选项,当
WORD
可以是
shell
escape

例如,如果
--quoting style=shell
某些文件将打印为“某些文件”,并将被解释为一个文件

另一个问题是输出文件可能与
ls
ed文件之一相同。我们也需要忽略它

所以答案是:

outputFile=a.txt; ls --ignore="*sh*" --ignore="${outputFile}" --quoting-style=shell | xargs cat > ${outputFile}

如果您还想从子目录获取文件,“find”是您的朋友:

find . -type f ! -name '*_BASE_*' ! -path ./all.txt -exec cat {} >> all.txt \+

它搜索当前目录及其子目录中的文件,只查找文件(
-type f
),忽略与通配符模式匹配的文件
*\u BASE.*
,忽略
all.txt
,并以与
xargs
相同的方式执行
cat

+1要限制到当前目录,请添加-maxdepth 1。这一部分还应该干净地处理文件名中的空格。另外,在rm all.txt前面加上前缀,并使用>>从cat执行重定向。结尾的+可能应该是;\+是一个故意减少猫的数量的选择。我不知道这个修饰语。酷!如果任何文件名包含空格,这两种方法都不起作用。当传递到
cat
时,类似“Some File”的文件名将显示为两个文件名,“Some”和“File”。