Как мне удалить одинаковые номера строк во всех файлах в каталоге?

В каком режиссере (ах | у) вы хотите это сделать? Это не понятно из вашего сценария. Попробуйте перейти в каталог 1 , например:

#!/bin/sh

GIT=`which git`
REPO_DIR=/home/username/Sites/git/repo/
cd ${REPO_DIR}
${GIT} add --all .
${GIT} commit -m "Test commit"
${GIT} push git@bitbucket.org:username/repo.git master

Или вы можете выполнить git add --all / path / to / git / repo / files .

Правка :

Запуск сценария из командной строки не обязательно аналогичен запуску его из cron; см. этот вопрос и ответ: Что такое «рабочий каталог», когда cron выполняет задание , особенно ответ Жиля .

1 Некоторые идеи о том, как проверить успешность выполнения команды

2
04.03.2018, 14:14
2 ответа

-ies una opción no -estándar sed. Viene de perl. GNU y FreeBSD sedagregaron -ide forma independiente a finales de 2001 y principios de 2002 para imitar el comportamiento de perlpero con diferentes interfaces. Se ha abierto camino en algunas implementaciones más desde que con más variación (en particular, en cuanto a la cantidad de metadatos del archivo original que se conserva ).

En perl, harías:

perl -ni.back -e 'print unless $. == 151..154' file

$.es el número de línea actual para el controlador de archivo de entrada actual . Cuando se usa <>/ -n, ese es el controlador de archivo ARGVque está abierto a su vez para cada uno de los archivos pasados ​​como argumento, pero dado que ARGVno está cerrado entre cada archivo, $.no está restablecer entre cada archivo. Para eso, necesitarías:

perl -ni.back -e '
  print unless $. == 151..154;
  close ARGV if eof' file1 file2

GNU sed, la primera implementación (AFAIK )para agregar una opción -ia laperl(agregada en 2001 -09 -25 pero no lanzada (en 3.95 )hasta un año después ), se restableció el número de línea entre cada archivo (-s, otra extensión GNU implícita ).

FreeBSD lo hizo de manera diferente . Las principales diferencias entre GNU y la API original de FreeBSD eran que -irequiere un argumento en FreeBSD mientras que es opcional en GNU sedcomo en perl. Y en FreeBSD, inicialmente, el número de línea no se reiniciaba entre cada archivo.

En 2007, FreeBSD se alineó con GNU sedcuando llegó al segundo punto . El número de línea se restableció entre cada archivo y se agregó una opción -Ipara obtener el comportamiento anterior de -i.

-ise agregó soporte mucho más tarde a otras implementaciones sedcomo busybox, NetBSD y OpenBSD, pero todas se alinearon con GNU seden ambos puntos.

macOS sedse basa en una versión antigua de FreeBSD, por lo que es probablemente la única implementación que se comporta como el antiguo FreeBSD hoy en día, y probablemente la que está utilizando.

Entonces, aquí, necesitaría usar perlcon:

find. -type f ! -name '*.back' -exec perl -ni.back -ne '
  print unless $. == 151..154;
  close ARGV if eof' {} +

O llame a uno sedpor archivo:

find. -type f ! -name '*.back' -exec sed -i.back 151,154d {} \;

O instale y use GNU sedo GNUawk(con -i inplacey haga coincidir los enfoques basados ​​en FNR, noNR)oed/ ex.

2
27.01.2020, 21:58

Esta respuesta usa exen lugar de sed -iporque sed -ino es una edición verdadera en -. Escribe en un archivo temporal y luego le cambia el nombre para reemplazar el original, lo que hace que cambie el número de inodo. Esto interrumpe los enlaces duros y las instantáneas en los sistemas de archivos COW (como btrfs o zfs )y cualquier otra cosa que dependa del número de inodo de un archivo. Lo mismo ocurre con la mayoría de los otros comandos comunes que implementan una opción -i/ --in-place(, incluida la opción )de perl's -i.

find. -type f -exec sh -c 'for f in "$@" ; do
    cp -a "$f" "$f.fix"
    printf "%s\n" 151,154d x | ex -s -- "$f" 
  done' sh {} +

Esto bifurca shpara procesar la lista de archivos encontrados por find.

El proceso shprimero hace una copia de respaldo del archivo original (usando la opción -ade GNU cppara preservar todos los atributos como la marca de tiempo y los permisos ), luego invoca expara editar el archivo.

El printf... | ex...anterior canaliza dos excomandos(*)en ex, cada comando separado por una nueva línea. El primer comando elimina las líneas 151 -154. El segundo(x)le dice a exque escriba los cambios en el archivo (de forma predeterminada, exse cerrará sin guardar a menos que le diga que guarde ). Si no se realizaron cambios, xse cierra sin guardar, igual que el comando :xen vi.

Tenga en cuenta :si cualquier archivo de entrada individual tiene menos de 154 líneas, entonces no se realizarán cambios en ese archivo.

La opción -sa exle dice que permanezca en silencio y que no imprima ningún mensaje de diagnóstico.

El --evita que los argumentos de nombre de archivo sean interpretados como opciones porex(en caso de que alguno de los nombres de archivo comience con-). Esto no es estrictamente necesario aquí porque todos los nombres de archivo generados por el comando findaquí tendrán ./antes de -pendiente -pero es inofensivo y es un buen hábito adquirirlo cuando se procesan nombres de archivo desconocidos.

Los comandos

(*)exson ​​prácticamente iguales a los comandos sed. Originalmente, hace mucho tiempo,edera el editor de archivos y sedera el editor de flujo basado en ed. Más tarde, vise escribió como una versión visual de ed. viagregó un modo de edición visual pero retuvo los comandos eden su modo de comando :. vitambién se puede ejecutar como expara editar el modo de comando -sin el modo visual, que es lo que se usa aquí. exsigue siendo en su mayor parte un clon de edpero ha obtenido algunas mejoras menores (como el comando x)sobre el original eden las décadas transcurridas desde que se escribió por primera vez.

2
27.01.2020, 21:58

Теги

Похожие вопросы