Concatene o conteúdo e os nomes dos arquivos

1

Eu tenho escrito por muitos meses. Os arquivos que eu crio são arquivos datados como 2011-06-13.markdown com conteúdo diário. Decidi que queria ter toda a escrita em um arquivo, mas gostaria que as entradas estivessem em ordem cronológica inversa com um cabeçalho da data (do nome do arquivo). Significa que eu gostaria de um diretório de arquivos separados como esses três:

2014-09-21.markdown

Look at all these words I've written!

2014-09-22.markdown

That's one serious writing habit I have!

2014-09-23.markdown

Asked question on stackexchange. Damn that is a helpful community!

para parecer um arquivo como este:

writing.markdown

2014-09-23

Asked question on stackexchange. Damn that is a helpful community!

2014-09-22

That's one serious writing habit I have!

2014-09-21

Look at all these words I've written!

Todos os arquivos estão em um diretório e são nomeados corretamente. Eu suspeito que alguma combinação de find e cat possa me ajudar, mas não sei exatamente como proceder.

    
por lyonsinbeta 24.09.2014 / 00:10

2 respostas

3

Aqui está uma maneira de fazer o que você quer com um único arquivo (que chamaremos de $file por enquanto) e imprimi-lo na saída padrão

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

Agora, para o que você realmente queria, coloque isso em um loop for para iterar em todos os marcadores no diretório. Em seguida, imprima o resultado em um arquivo.

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: Espere, não é isso que você queria! Para reverter o pedido, podemos usar o comando find para encontrar todos os arquivos de remarcação e depois enviar a saída para sort -r para obter a ordem de classificação inversa desejada. Finalmente, canalize isso em read e loop. Além disso, precisaremos chamar basename ao extrair a data do nome do arquivo, pois find retornará um caminho em vez de um nome de arquivo.

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

Como eles são muito difíceis de pesquisar no Google, estou incluindo um link para alguma documentação sobre Aqui Strings caso você não esteja familiarizado com eles.

    
por 24.09.2014 / 00:49
0

Você pode tentar algo assim. Escrevi em três arquivos de texto sample1 , sample2 e sample3 com o conteúdo exato que você forneceu. Quando eu digito este comando:

cat sample1 sample2 sample3 >> sample4

Eu obtenho isso para resultados quando eu 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!

O >> é anexado a sample4 , enquanto um único > sobrescreveria sample4 cada vez que for usado. Então, no seu caso, você pode usar este comando:

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

Espero que isso ajude.

    
por 24.09.2014 / 00:18