unix: how to concatenate files matched in grep

*爱你&永不变心* 提交于 2019-12-12 13:51:39

问题


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.



来源:https://stackoverflow.com/questions/8531466/unix-how-to-concatenate-files-matched-in-grep

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!