grep里面循环删除文件!! [Bash script]

时间:2015-10-02 10:25:51

标签: bash while-loop 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 个答案:

答案 0 :(得分:0)

避免使用父目录

codigos.txt

for 正在输入第二个continue循环。

如果${i##*.}等于codigos,则Alternativaly更改文件扩展名或使用{{1}}语句。

注意:可以重做此流程而无需解析,避免使用grep。