2011-12-16 2 views
3

Я хочу объединить файлы, имя которых не содержит «_BASE_». Я думал, что это будет где-то рядом ...unix: как объединить файлы, сопоставленные в grep

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

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

ответ

2

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

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

Кроме того, вы можете сделать это без xargs:

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

UPD: Дейл Hagglund заметил, что имя файла, как "Некоторые File" появится в виде двух имен файлов, "некоторые" и «Файл ». Чтобы избежать этого, вы можете использовать опцию --quoting-style=WORD, когда WORD может быть shell или escape.

Например, если --quoting-style=shell Некоторые файлы будут печататься как «Некоторые файлы» и будут интерпретироваться как один файл.

Другая проблема - выходной файл может совпадать с одним из ls ed файлов. Мы также должны игнорировать это.

Так Ответ:

outputFile=a.txt; ls --ignore="*sh*" --ignore="${outputFile}" --quoting-style=shell | xargs cat > ${outputFile} 
+0

Ни один из них не работает, если какой-либо из имен файлов содержит пробелы. Имя файла, например «Some File», будет отображаться в виде двух имен файлов «Some» и «File», когда передается 'cat'. –

+0

Исправлен ответ –

1

Если вы хотите получить также файлы из подкаталогов, `найти» является вашим другом:

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

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

+0

+1 Чтобы ограничить текущий каталог, добавьте -maxdepth 1. Это также должно чисто обрабатывать пространства файлов в их имени. – jackrabbit

+0

Я бы процитировал часть '* _BASE_ *' (в противном случае это не работает в zsh). Также добавьте rm all.txt и выполните перенаправление от cat с помощью >>. + В конце должно быть; – jackrabbit

+0

\ + является преднамеренным выбором для сокращения числа кошек. – tuomasjjrasanen

Смежные вопросы