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