Как мне отсортировать список файлов и объединить содержимое в bash?

#linux #bash #sorting #sed #concatenation

#linux #bash #сортировка #sed #объединение

Вопрос:

Это работает:

 find . -name "*.1" -print0 | xargs -0 cat > list.txt
  

Но когда я пытаюсь отсортировать имена файлов, удалите новую строку, список имен файлов, которые передаются в cat, выглядит идентично предыдущему, но отсортирован:

 find . -name "*.1" | sort | sed ':a;N;$!ba;s/n//g' | xargs -0 cat > list.txt
  

Однако cat возвращает эту ошибку:

 : No such file or directory
  

Ответ №1:

Ваш оператор xargs ожидает записи с завершением null.

 find . -name '*.1' | sort | tr 'n' ' ' | xargs cat > list.txt
  

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

Ответ №2:

Просто используйте терминаторы nul до конца:

 find . -name "*.1" -print0 | sort -z | xargs -0 cat > list.txt
  

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