Como adicionar nome de arquivo ao final de cada linha - todos os arquivos em todos os subdiretórios

0

Eu quero adicionar uma linha ao meu script bash (ubuntu 16) para adicionar o nome do arquivo ao final de cada linha em um arquivo - ou seja, todos os arquivos em uma pasta e todos os arquivos em todas as subpastas.

Os nomes dos arquivos são alfanuméricos com alguns caracteres especiais, como -_.

Por exemplo:

Linha no arquivo filename_ghrut.txt antes:

blah blah blah
blahblah blahblah

Linha no arquivo filename_ghrut.txt depois:

blah blah blah filename_ghrut.txt
blahblah blahblah filename_ghrut.txt

Eu pesquisei, mas a maioria dos comandos parece não funcionar.

Eu quero rodar isso em todos os arquivos em todas as subpastas de um diretório específico.

Muito obrigado.

Eu encontrei isso, mas não funciona bem:

ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %
    
por speld_rwong 29.04.2017 / 04:09

2 respostas

0

Tente isso usando find e sed :

find /path/to/top_directory -type f -execdir sed -i -e "s/$/ {}/" {} \;

Substitua /path/to/top_directory pelo diretório onde os arquivos que você deseja editar são.

    
por 29.04.2017 / 04:27
0

Com perl e find

find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
  • s/$/ $ARGV/ adiciona espaço e nome de arquivo ao final de cada linha
  • -i para edição no local, use i.bkp se você quiser manter um backup dos arquivos originais
  • Se o seu find não for compatível com + , use \;
  • find . -type f dará lista de todos os arquivos no diretório atual
  • -exec permite usar um comando para agir sobre todos esses arquivos
  • Use find . -type f -name '*.txt' se você quiser restringir somente os arquivos que terminam com .txt


Obrigado @thiagowfx por apontar que a solução acima irá adicionar o nome do arquivo como ./file.txt , ./foo/file2.txt , etc

Use isto para adicionar somente nome de arquivo sem ./ etc

find . -type f -exec perl -i -pe 's/$/$ARGV=~s|.*\/| |r/e' {} +
  • $ARGV=~s|.*\/| |r fornecerá o nome do arquivo com todos os caracteres até / removed
por 29.04.2017 / 04:25