我想连接名称不包含“_BASE_”的文件。我以为它会在某个地方...
ls | grep -v _BASE_ | cat > all.txt
猫部分是我做错的。有人可以给我一些想法吗?
试试这个
ls | grep -v _BASE_ | xargs cat > all.txt
ls
您可以使用 using选项忽略某些文件,--ignore
然后将它们放入文件中。
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
Some File 将打印为“Some File”并将被解释为一个文件。
另一个问题是输出文件可能与其中一个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
),忽略与通配符模式匹配的文件*_BASE_*
,忽略all.txt
并以与将要执行cat
的方式相同的方式执行xargs
。