我正在编写一个 bash 脚本,我对一个神秘的循环感到疯狂。
我需要在包含许多代码的文本文件(codigos.txt)中寻找具体代码,如果找到代码,我需要寻找下一个代码(siguienteCodigo++),直到找不到代码,所以我'编写了下一个 while 循环(其中 $siguienteCodigo 是包含要搜索的代码的变量,$rutaOrigen 是包含代码的文件 codigos.txt 的路径):
while grep -F "$siguienteCodigo" "$rutaOrigen/codigos.txt"; do
let siguienteCodigo++
done
但当我执行脚本时,令我惊讶的是,它似乎找到了代码,但 codigos.txt 文件被删除了!
下面是完整的脚本:
#!/bin/bash
#
################################################################################
# SCRIPT PARA CODIFICAR RECURSIVAMENTE TODAS LAS FOTOGRAFÍAS DE LOS ARTÍCULOS #
# Y REGISTRARLAS EN UNA HOJA DE CÁLCULO DE MICROSOFT EXCEL #
################################################################################
#
# Extraemos el día, mes, año, hora, minuto y segundo
day="$(date +%d)"
month="$(date +%m)"
year="$(date +%Y)"
hour="$(date +%H)"
minute="$(date +%M)"
second="$(date +%S)"
# Extraemos la ruta de origen, donde se ejecuta el script
rutaOrigen="$(pwd)"
# Recorremos todos los directorios listados recursivamente, a partir de la ruta
# de origen
for d in $(ls -R | grep "^\." | sed 's/://'); do
# Cambiamos al directorio
cd "$d"
# Buscamos cuál es el último artículo codificado
ultimoCodigo=$(printf "%08d" "0")
# Recorremos todos los archivos que nos interesa listar, que son todos
# los archivos con extensión .jpg .JPG y .txt
for i in $(ls *.jpg *.JPG *.txt); do
# Extraemos el nombre del archivo, sin extensión
case "${i##*.}" in
"jpg")
fotoActual="$(basename -s ".jpg" "$i")";;
"JPG")
fotoActual="$(basename -s ".JPG" "$i")";;
"txt")
fotoActual="$(basename -s ".txt" "$i")";;
esac
# Extraemos los 8 primeros carácteres del archivo, que
# corresponderán al "código 8" del artículo
codigo8=$(expr substr "$fotoActual" 1 8)
# Si los 8 primeros carácteres del archivo forman un numérico
# entero y éste es mayor que el último "codigo 8" guardado,
# inicialmente iniciado a 0...
if [[ $codigo8 =~ ^[0-9]+$ ]] && (( codigo8 > ultimoCodigo )); then
# Guardamos el "código 8" actual como el último código,
# es decir, como el último artículo codificado
ultimoCodigo=$(printf "%08d" "$codigo8")
fi
done
# Volvemos a recorrer todos los archivos que nos interesa listar, esta
# vez para codificar los que no están codificados, es decir, los que
# siguen al último artículo codificado
for i in $(ls *.jpg *.JPG *.txt); do
# Extraemos el nombre del archivo, sin extensión
case "${i##*.}" in
"jpg")
fotoActual="$(basename -s ".jpg" "$i")";;
"JPG")
fotoActual="$(basename -s ".JPG" "$i")";;
"txt")
fotoActual="$(basename -s ".txt" "$i")";;
esac
# Extraemos los 8 primeros carácteres del archivo, que
# corresponderán al "código 8" del artículo
codigo8=$(expr substr "$fotoActual" 1 8)
siguienteCodigo=$(($ultimoCodigo + 1))
# Si los 8 primeros carácteres del archivo forman un numérico
# entero y éste es mayor que el último "código 8" guardado...
if [[ $codigo8 =~ ^[0-9]+$ ]] && (( codigo8 <= ultimoCodigo )); then
:
else
while grep -F "$siguienteCodigo" "$rutaOrigen/codigos.txt"; do
let siguienteCodigo++
done
rutaActual="$(pwd)"
carpetaActual="$(basename "$rutaActual")"
caracteresCarpeta=$(expr length "$carpetaActual")
descripcion="$(expr substr "$carpetaActual" 10 $caracteresCarpeta)"
rutaActual="$(echo -e "$rutaActual" | sed 's/\//\\/g' | sed 's/\\media\\sf_E_DRIVE/E:/')"
let ultimoCodigo++
newFile=$(printf "%08d_${day}-${month}-${year}_${hour}-${minute}-${second}.jpg" "$siguienteCodigo")
mv -- "$i" "$newFile"
echo -e "$siguienteCodigo\t$rutaActual\t$descripcion\t$day/$month/$year\t$hour:$minute:$second" | awk -F '\t' '{print $1,$2,$3,$4,$5}' OFS='\t' >> "$rutaOrigen/registroarticulos.xls"
fi
done
cd "$rutaOrigen"
done
echo "Se creó una hoja de registro en $rutaOrigen/registroarticulos.xls"
echo "Todas las fotografías fueron codificadas correctamente :)"
exit 0
答案1
您的脚本正在处理.JPG
、.jpg
和.txt
文件。
该文件在第一次运行时在从输出派生的目录codigos.txt
上重命名。.
$(ls -R | grep "^\." | sed 's/://')
在我的机器上进行测试运行时,该文件codigos.txt
被重命名为00000002_02-10-2015_13-18-59.jpg