Unix: как объединить файлы, соответствующие в grep - PullRequest
3 голосов
/ 16 декабря 2011

Я хочу объединить файлы, имя которых не включает "_BASE_".Я думал, что это будет где-то вроде ...

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

часть кошки - это то, что я не понимаю правильно.Кто-нибудь может дать мне некоторое представление об этом?

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Попробуйте это

ls | grep -v _BASE_ | xargs cat > all.txt
2 голосов
/ 16 декабря 2011

Вы можете игнорировать некоторые файлы с помощью ls, используя опцию --ignore, а затем поместить их в файл.

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

Также вы можете сделать это без xargs:

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

UPD : Дейл Хагглунд заметил, что имя файла, например «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}
1 голос
/ 16 декабря 2011

Если вы хотите получить также файлы из подкаталогов, `find '- ваш друг:

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

Он ищет файлы в текущем каталоге и его подкаталогах, он находит только файлы (-type f),игнорирует файлы, соответствующие шаблону подстановки *_BASE_*, игнорирует all.txt и выполняет cat так же, как xargs.

...