
Quiero agregar una línea a mi script bash (ubuntu 16) para agregar el nombre del archivo al final de cada línea de un archivo, es decir, cada archivo de una carpeta y todos los archivos de todas las subcarpetas.
Los nombres de archivos son alfanuméricos con algunos caracteres especiales como -_.
Por ejemplo:
Línea en el archivo filename_ghrut.txt
antes:
blah blah blah
blahblah blahblah
Línea en el archivo filename_ghrut.txt
después de:
blah blah blah filename_ghrut.txt
blahblah blahblah filename_ghrut.txt
He buscado por ahí pero la mayoría de los comandos no parecen funcionar.
Quiero ejecutar esto en todos los archivos de todas las subcarpetas de un directorio específico.
Muchas gracias.
Encontré esto, pero no funciona del todo:
ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %
Respuesta1
Con perl
yfind
find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
s/$/ $ARGV/
agregue espacio y nombre de archivo al final de cada línea-i
para edición in situ, utilíceloi.bkp
si desea conservar una copia de seguridad de los archivos originales- Si
find
no es compatible+
, utilice\;
en su lugar find . -type f
dará una lista de todos los archivos en el directorio actual-exec
permite utilizar un comando para actuar sobre todos esos archivos- Úselo
find . -type f -name '*.txt'
si desea restringir solo los archivos que terminan en.txt
Gracias @thiagowfx por señalar que la solución anterior agregará el nombre de archivo como ./file.txt
, ./foo/file2.txt
etc.
Use esto para agregar solo el nombre del archivo sin ningún ./
etc.
find . -type f -exec perl -i -pe 's/$/$ARGV=~s|.*\/| |r/e' {} +
$ARGV=~s|.*\/| |r
dará un nombre de archivo con todos los caracteres hasta/
eliminados
Respuesta2
Con GNU awk
:
LC_ALL=C find . -type f -exec gawk -i /usr/share/awk/inplace.awk '
BEGINFILE {suffix = FILENAME; sub(/.*\//, "", suffix)}
{print $0, suffix}' {} +
Tenga en cuenta que si hay varios enlaces físicos del mismo archivo, el nombre de cada uno se agregará (sin ningún orden en particular) a cada línea de ese archivo.
En todo caso,no utilice-i inplace
as gawk
intenta cargar primero la inplace
extensión (como inplace
o inplace.awk
) desde el directorio de trabajo actual, donde alguien podría haber colocado malware. La ruta de la inplace
extensión suministrada gawk
puede variar según el sistema; consulte el resultado degawk 'BEGIN{print ENVIRON["AWKPATH"]}'
Respuesta3
Pruebe esto, usando find
y sed
:
find /path/to/top_directory -type f -execdir sed -i -e "s/$/ {}/" {} \;
Reemplace /path/to/top_directory
con el directorio donde están los archivos que desea editar.