В каком режиссере (ах | у) вы хотите это сделать? Это не понятно из вашего сценария. Попробуйте перейти в каталог 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 Некоторые идеи о том, как проверить успешность выполнения команды
-i
es una opción no -estándar sed
. Viene de perl
. GNU y FreeBSD sed
agregaron -i
de forma independiente a finales de 2001 y principios de 2002 para imitar el comportamiento de perl
pero 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 ARGV
que está abierto a su vez para cada uno de los archivos pasados como argumento, pero dado que ARGV
no 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 -i
a 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 -i
requiere un argumento en FreeBSD mientras que es opcional en GNU sed
como 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 sed
cuando llegó al segundo punto . El número de línea se restableció entre cada archivo y se agregó una opción -I
para obtener el comportamiento anterior de -i
.
-i
se agregó soporte mucho más tarde a otras implementaciones sed
como busybox, NetBSD y OpenBSD, pero todas se alinearon con GNU sed
en ambos puntos.
macOS sed
se 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 perl
con:
find. -type f ! -name '*.back' -exec perl -ni.back -ne '
print unless $. == 151..154;
close ARGV if eof' {} +
O llame a uno sed
por archivo:
find. -type f ! -name '*.back' -exec sed -i.back 151,154d {} \;
O instale y use GNU sed
o GNUawk
(con -i inplace
y haga coincidir los enfoques basados en FNR
, noNR
)oed
/ ex
.
Esta respuesta usa ex
en lugar de sed -i
porque sed -i
no 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 sh
para procesar la lista de archivos encontrados por find
.
El proceso sh
primero hace una copia de respaldo del archivo original (usando la opción -a
de GNU cp
para preservar todos los atributos como la marca de tiempo y los permisos ), luego invoca ex
para editar el archivo.
El printf... | ex...
anterior canaliza dos ex
comandos(*)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 ex
que escriba los cambios en el archivo (de forma predeterminada, ex
se cerrará sin guardar a menos que le diga que guarde ). Si no se realizaron cambios, x
se cierra sin guardar, igual que el comando :x
en 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 -s
a ex
le 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 find
aquí tendrán ./
antes de -pendiente -pero es inofensivo y es un buen hábito adquirirlo cuando se procesan nombres de archivo desconocidos.
(*)ex
son prácticamente iguales a los comandos sed
. Originalmente, hace mucho tiempo,ed
era el editor de archivos y sed
era el editor de flujo basado en ed
. Más tarde, vi
se escribió como una versión visual de ed
. vi
agregó un modo de edición visual pero retuvo los comandos ed
en su modo de comando :
. vi
también se puede ejecutar como ex
para editar el modo de comando -sin el modo visual, que es lo que se usa aquí. ex
sigue siendo en su mayor parte un clon de ed
pero ha obtenido algunas mejoras menores (como el comando x
)sobre el original ed
en las décadas transcurridas desde que se escribió por primera vez.