Конкатенация содержимого файла И имен

Я писал много месяцев. Файлы, которые я создаю, являются датированными файлами с именем 2011-06-13.markdown с ежедневным содержимым. Я решил, что хочу иметь все записи в одном файле, но я хотел бы, чтобы записи находились в обратном хронологическом порядке с заголовком даты (из имени файла). Я хочу, чтобы каталог отдельных файлов, таких как эти три:

2014-09-21.markdown

Посмотрите на все эти слова, которые я написал!

2014-09-22.markdown

Это одна серьезная привычка писать!

2014-09-23.markdown

Заданный вопрос по stackexchange. Черт, это полезное сообщество!

чтобы выглядеть похожим на один файл:

writing.markdown

2014-09-23

Заданный вопрос по stackexchange. Черт, это полезное сообщество!

2014-09-22

Это одна серьезная привычка писать!

2014-09-21

Посмотрите на все эти слова, которые я написал!

Все файлы находятся в одном каталоге и правильно указаны. Я подозреваю, что какая-то комбинация find и cat могут мне помочь, но я точно не знаю, как это сделать.

2 Solutions collect form web for “Конкатенация содержимого файла И имен”

Вот способ сделать то, что вы хотите, с одним файлом (который мы будем называть $file на данный момент) и распечатать его до стандартного вывода

 # prepend a "# " and remove the .markdown from the filename sed 's/\.markdown//' <<< "# $file" # print a blank line echo # output the file cat "$file" 

Теперь для того, что вы действительно хотели, заключите, что в цикле for перебирать каждую уценку в каталоге. Затем выведите результат в файл.

 for file in *.markdown; do # prepend a "# " and remove the .markdown from the filename sed 's/\.markdown//' <<< "# $file" # print a blank line echo # output the file cat "$file" # separate the files with another blank line echo done > writing.markdown 

EDIT: Подождите, это не то, что вы хотели! Чтобы отменить порядок, мы можем использовать команду find для поиска всех файлов разметки, а затем передать вывод в sort -r чтобы получить требуемый порядок обратного сортировки. Наконец, трубу, которая в read и цикл. Кроме того, нам нужно вызвать basename при извлечении даты из имени файла, так как find возвращает путь, а не имя файла.

 find -name '*.markdown' -not -name 'writing.markdown' | sort -r | while read file; do # prepend a "# " and remove the .markdown from the filename sed 's/\.markdown//' <<< "# $(basename $file)" # print a blank line echo # output the file cat "$file" # separate the files with another blank line echo done > writing.markdown 

Поскольку они действительно трудны для google, я включаю ссылку на некоторую документацию на Here Strings, если вы не знакомы с ними.

Вы можете попробовать что-то вроде этого. Я написал три текстовых файла sample1 , sample2 и sample3 с точным содержимым, которое вы предоставили. Когда я набираю эту команду:

cat sample1 sample2 sample3 >> sample4

Я получаю это для результатов, когда я cat sample4 :

 2014-09-23 Asked question on stackexchange. Damn that is a helpful community! 2014-09-22.markdown That's one serious writing habit I have! 2014-09-21.markdown Look at all these words I've written! 

Приложение >> добавляет в sample4 , тогда как single > будет перезаписывать sample4 каждый раз, когда он будет использоваться. Поэтому в вашем случае вы можете использовать эту команду:

cat 2014-09-23.markdown 2014-09-22.markdown 2014-09-21.markdown >> writing.markdown

Надеюсь, это поможет.

  • Как добавить текст в выходной файл?
  • BASH | Отчет формата CSV
  • Как загрузить HTML-файл с обфускацией текста
  • Тест веб-камеры Debian / Raspberry usb перед выпуском скрипта fswebcam, множественный сбой приведет к сбою ОС
  • grep для текста, который может или не может присутствовать
  • Загрузить файл, связанный в MySQL DB, извлечь текст и вставить в db с помощью скрипта bash?
  • grep searchstring / etc / crontab странное поведение в скрипте BASH
  • vim auto complete custom list
  • Как работает awk?! ++?
  • Bash-скрипт для файлов ftp только типа gz в текущем каталоге
  • Добавить строку после определенной строки в одной строке в текстовом файле
  • Linux и Unix - лучшая ОС в мире.