
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.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.
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 perl
efind
find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
s/$/ $ARGV/
adicione espaço e nome de arquivo ao final de cada linha-i
para edição local, usei.bkp
se quiser manter um backup dos arquivos originais- Se você
find
não suportar+
, use\;
em vez disso find . -type f
fornecerá uma 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 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|.*\/| |r
dará 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 inplace
as gawk
tenta carregar primeiro a inplace
extensão (como inplace
ou inplace.awk
) do diretório de trabalho atual, onde alguém poderia ter plantado malware. O caminho da inplace
extensão fornecida gawk
pode variar de acordo com o sistema, consulte a saída degawk 'BEGIN{print ENVIRON["AWKPATH"]}'
Responder3
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 estão os arquivos que você deseja editar.