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

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

Quero adicionar uma linha ao meu script bash (ubuntu 16) para adicionar o nome do arquivo ao final de cada linha de 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.txtantes:

blah blah blah
blahblah blahblah

Linha no arquivo filename_ghrut.txtdepois:

blah blah blah filename_ghrut.txt
blahblah blahblah filename_ghrut.txt

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

Quero executar isso em todos os arquivos em todas as subpastas de um diretório específico.

Muito obrigado.

Eu encontrei isso, mas não funciona muito bem:

ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %

Responder1

Com perlefind

find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
  • s/$/ $ARGV/adicione espaço e nome de arquivo ao final de cada linha
  • -ipara edição local, use i.bkpse quiser manter um backup dos arquivos originais
  • Se você findnão suportar +, use \;em vez disso
  • find . -type ffornecerá uma lista de todos os arquivos no diretório atual
  • -execpermite usar um comando para agir sobre todos esses arquivos
  • Use find . -type f -name '*.txt'se quiser restringir apenas arquivos que terminam com.txt


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

Use isto para adicionar apenas o nome do arquivo sem qualquer ./etc.

find . -type f -exec perl -i -pe 's/$/$ARGV=~s|.*\/| |r/e' {} +
  • $ARGV=~s|.*\/| |rdará o nome do arquivo com todos os caracteres /removidos

Responder2

Com GNU awk:

LC_ALL=C find . -type f -exec gawk -i /usr/share/awk/inplace.awk '
  BEGINFILE {suffix = FILENAME; sub(/.*\//, "", suffix)}
  {print $0, suffix}' {} +

Esteja ciente de que se houver vários links físicos do mesmo arquivo, o nome de cada um será adicionado (sem nenhuma ordem específica) a cada linha desse arquivo.

Em todo o caso,não use-i inplaceas gawktenta carregar primeiro a inplaceextensão (como inplaceou inplace.awk) do diretório de trabalho atual, onde alguém poderia ter plantado malware. O caminho da inplaceextensão fornecida gawkpode variar de acordo com o sistema, consulte a saída degawk 'BEGIN{print ENVIRON["AWKPATH"]}'

Responder3

Tente isso, usando finde sed:

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

Substitua /path/to/top_directorypelo diretório onde estão os arquivos que você deseja editar.

informação relacionada