while 루프에서 Grep이 파일을 삭제합니다! [쿵쿵 스크립트]

while 루프에서 Grep이 파일을 삭제합니다! [쿵쿵 스크립트]

나는 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

관련 정보