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.
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/$/;%/' %
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.
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 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 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