unix: how to concatenate files matched in grep

2019-07-07 04:51发布

I want to concatenate the files whose name does not include "_BASE_". I thought it would be somewhere along the lines of ...

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

the cat part is what I am not getting right. Can anybody give me some idea about this?

标签: unix grep cat
3条回答
smile是对你的礼貌
2楼-- · 2019-07-07 05:16

Try this

ls | grep -v _BASE_ | xargs cat > all.txt
查看更多
萌系小妹纸
3楼-- · 2019-07-07 05:21

You can ignore some files with ls using --ignore option and then cat them into a file.

ls --ignore="*_BASE_*" | xargs cat > all.txt 

Also you can do that without xargs:

cat $( ls --ignore="*_BASE_*" ) > all.txt

UPD: Dale Hagglund noticed, that filename like "Some File" will appear as two filenames, "Some" and "File". To avoid that you can use --quoting-style=WORD option, when WORD can be shell or escape.

For example, if --quoting-style=shell Some File will print as 'Some File' and will be interpreted as one file.

Another problem is output file could the same of one of lsed files. We need to ignore it too.

So answer is:

outputFile=a.txt; ls --ignore="*sh*" --ignore="${outputFile}" --quoting-style=shell | xargs cat > ${outputFile}
查看更多
做个烂人
4楼-- · 2019-07-07 05:24

If you want to get also files from subdirectories, `find' is your friend:

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

It searches files in the current directory and its subdirectories, it finds only files (-type f), ignores files matching to wildcard pattern *_BASE_*, ignores all.txt, and executes cat in the same manner as xargs would.

查看更多
登录 后发表回答