Я пытаюсь поместить все файлы js в каталог и подкаталоги в один файл в лексическом порядке. Что я сделал не так?
1 ответ
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