1

Я пытаюсь поместить все файлы js в каталог и подкаталоги в один файл в лексическом порядке. Что я сделал не так?

1 ответ1

0

grep - неподходящий инструмент для этого, отчасти потому, что он генерирует только строки из тех файлов, которые соответствуют заданному вами шаблону (и, вероятно, вам нужны все строки), а отчасти потому, что вы не указали шаблон, поэтому он использует первое имя файла как шаблон (что не полезно).

Перечислить все файлы *.js достаточно просто:

find . -name '*.js'

И объединить их в один файл тоже легко:

find . -name '*.js' | xargs cat

Но сортировать их в соответствии с лексическим порядком только имени файла, не обращая внимания на каталог, в котором они могут находиться, сложнее.

Попросту sort не будут делать эту работу, и нет --key варианта , который выберет последнее поле , когда количество полей неизвестно.

Следующее использует sed, чтобы переместить имя файла в начало строки, сортирует его, а затем удаляет его снова.

find . -name '*.js' | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2-

Это не будет работать правильно, если у любого из ваших файлов или каталогов есть пробелы.

Затем вы можете извлечь содержимое, добавив cat:

find . -name '*.js' \
      | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2- \
      | xargs cat

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .