Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grep-insidewhile-loop删除文件!![Bash脚本]_Bash_While Loop_Grep - Fatal编程技术网

Grep-insidewhile-loop删除文件!![Bash脚本]

Grep-insidewhile-loop删除文件!![Bash脚本],bash,while-loop,grep,Bash,While Loop,Grep,我正在写一个bash脚本,我对一个神秘的循环变得疯狂。。。所以我希望你能得到一些帮助 我需要在包含许多代码的文本文件(codigos.txt)中寻找一个具体的代码,如果找到了代码,我需要寻找下一个(siguienteCodigo++),直到找不到代码,所以我编写了下一个while循环(其中,$siguienteCodigo是包含要搜索的代码的变量,$rutaOrigen是包含代码的文件codigos.txt的路径): 但是当我执行脚本时,我惊讶的是,它似乎找到了代码,但是codigos.txt文

我正在写一个bash脚本,我对一个神秘的循环变得疯狂。。。所以我希望你能得到一些帮助

我需要在包含许多代码的文本文件(codigos.txt)中寻找一个具体的代码,如果找到了代码,我需要寻找下一个(siguienteCodigo++),直到找不到代码,所以我编写了下一个while循环(其中,$siguienteCodigo是包含要搜索的代码的变量,$rutaOrigen是包含代码的文件codigos.txt的路径):

但是当我执行脚本时,我惊讶的是,它似乎找到了代码,但是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
!/bin/bash
#
################################################################################
#剧本《艺术之旅》中的故事情节#
#微软EXCEL的注册人#
################################################################################
#
#厄尔迪亚、梅斯、阿尼诺、霍拉、米努托和塞贡多
day=“$(日期+%d)”
月份=“$(日期+%m)”
年份=“$(日期+%Y)”
hour=“$(日期+%H)”
分钟=“$(日期+%M)”
second=“$(日期+%S)”
#奥里根之路的特蕾莫斯酒店
rutaOrigen=“$(pwd)”
#重新考虑董事名单,一个政党
#德奥利金
对于美元形式的d(ls-R | grep“^\”| sed's/:/”),请执行
#坎比亚莫斯董事会
cd“$d”
#布斯卡莫斯·库拉尔的艺术作品
ultimoCodigo=$(printf“%08d”0)
#请记录您对本文件感兴趣的内容,并记录您对本文件感兴趣的内容
#los archivos con extensión.jpg.jpg y.txt
对于以美元表示的i(ls*.jpg*.jpg*.txt);是否
#阿奇沃市名外酒店
中的大小写“${i##*.}”
“jpg”)
fotoActual=“$(basename-s.jpg”“$i”);;
“JPG”)
fotoActual=“$(basename-s.JPG”“$i”);;
“txt”)
fotoActual=“$(basename-s.txt”“$i”);;
以撒
#克什米尔阿尔奇沃8号酒店
#通讯员“código 8”del artículo
codigo8=$(expr substr“$fotoActual”18)
#这是第八个主要的建筑风格
#该市市长que elúltimo“codigo 8”guardado,
#伊尼西亚多阿0。。。
如果[$codigo8=~^[0-9]+$]&&((codigo8>ultimoCodigo));然后
#Guardamos el“código 8”实际科莫·埃尔蒂莫·código,
#最后,科莫·埃尔蒂莫·阿特·卡多(como elúltimo artículo Catcodicado)
ultimoCodigo=$(printf“%08d”$codigo8)
fi
完成
#这本书是一本很有趣的书
#维兹·帕拉·卡多斯(vez para Car los que no están Catcodicados),decir,los que
#西格恩·阿尔蒂莫·阿特·卡多
以美元表示的i(ls*.jpg*.jpg*.txt);做
#阿奇沃市名外酒店
中的大小写“${i##*.}”
“jpg”)
fotoActual=“$(basename-s.jpg”“$i”);;
“JPG”)
fotoActual=“$(basename-s.JPG”“$i”);;
“txt”)
fotoActual=“$(basename-s.txt”“$i”);;
以撒
#克什米尔阿尔奇沃8号酒店
#通讯员“código 8”del artículo
codigo8=$(expr substr“$fotoActual”18)
siguienteCodigo=$($ultimoCodigo+1))
#这是第八个主要的建筑风格
#肠胃疾病市长que elúltimo“código 8”guardado。。。
如果[$codigo8=~^[0-9]+$]&&($codigo8>“$rutaOrigen/registoraticulos.xls”
fi
完成
cd“$rutaOrigen”
完成
echo“登记处的注册费为$rutaOrigen/registoroticulos.xls”
echo“Todas las fotografías fueron编目更正:)”
出口0

避免使用父目录:

ls -R | grep "^\./" | sed 's/://'
codigos.txt
正在为循环输入第二个

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


注意:此流可以在不解析的情况下重做,避免使用grep。

更好的建议是避免完全解析ls:)你完全正确@TomFenech脚本可以用更合适的方式重做..毫无疑问..谢谢你的回答,klashxx:)问题是我需要在父目录的所有目录中递归搜索,包括父目录。也许一个解决方案是将codigos.txt移动到一个更高的目录中并直接grepping到它。那么,在所有目录中查找而不解析ls,Tom Fenech,或者只更改codigos文件扩展名@kalero,该解决方案是什么呢
ls -R | grep "^\./" | sed 's/://'