Cómo agregar el nombre del archivo al final de cada línea: todos los archivos en todos los subdirectorios

Cómo agregar el nombre del archivo al final de cada línea: todos los archivos en todos los subdirectorios

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.txtantes:

blah blah blah
blahblah blahblah

Línea en el archivo filename_ghrut.txtdespué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 perlyfind

find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
  • s/$/ $ARGV/agregue espacio y nombre de archivo al final de cada línea
  • -ipara edición in situ, utilícelo i.bkpsi desea conservar una copia de seguridad de los archivos originales
  • Si findno es compatible +, utilice \;en su lugar
  • find . -type fdará una lista de todos los archivos en el directorio actual
  • -execpermite 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.txtetc.

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|.*\/| |rdará 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 inplaceas gawkintenta cargar primero la inplaceextensión (como inplaceo inplace.awk) desde el directorio de trabajo actual, donde alguien podría haber colocado malware. La ruta de la inplaceextensión suministrada gawkpuede variar según el sistema; consulte el resultado degawk 'BEGIN{print ENVIRON["AWKPATH"]}'

Respuesta3

Pruebe esto, usando findy sed:

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

Reemplace /path/to/top_directorycon el directorio donde están los archivos que desea editar.

información relacionada