unix: how to concatenate files matched in grep

2019-07-07 04:35发布

问题:

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?

回答1:

Try this

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


回答2:

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}


回答3:

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.



标签: unix grep cat