Carpeta anterior y siguiente usando Bash


0

Esto es similar a ¿Cómo listar carpetas usando comandos bash? . Tengo una estructura de carpetas del formato foo / YYYY / MM / DD / HHMM (a intervalos de 10 minutos). ¿Cuál es la forma más fácil de obtener el nombre de la carpeta anterior y la siguiente?

Pensé en

sTimeNow=$(date "${iYear}/${iMnt}/${iDay} ${iHr}:${iMin):00")
sTimeBefore=$(date "${sTimeNow} - "10 minutes")
sTimeAfter=$(date "${sTimeNow} + "10 minutes")

y con un poco (subestimación ...) de formato podría obtener los dos directorios.
Sin embargo, la fecha en matemáticas probablemente no sea la mejor manera de hacerlo, y me faltan fechas (que es mi objetivo final para solucionar)

También pensé en poblar una lista.

MyList='ls -dr *"
iFolder= get current folder index (how?)
sFolderBefore=$Mylist[${iFolder}-1]  so much easier
sFolderAfter=$Mylist[${iFolder}+1]

(todo lo anterior puede tener errores de sintaxis, disculpas novatos)

Respuestas:


0

Probaría algo como:

find {root_of_folders} -type d | sort | grep -A 1 "$(basename "$PWD")\$" | tail -1

En otras palabras: muestra todos los directorios y encuentra el que viene después del actual en la lista. Con el final \$ itera sus subdirectorios, sin él va al siguiente directorio en el mismo nivel.

Para el directorio anterior utilizas -B 1 y head -1.

Edición: algunas mejoras:

  1. el código anterior tiene problemas si los nombres de los archivos contienen cosas que se pueden interpretar como sintaxis de expresiones regulares (caracteres entre paréntesis, en particular), por lo que es mejor grep -F (pero ya no puedes usar el \$ )

  2. Para evitar resultados falsos si un nombre de directorio no es una parte inicial de otro, prefije con una / para forzar que la coincidencia ocurra desde el principio.

Entonces, la forma mejorada es:

find {root_of_folders} -type d | sort | grep -A 1 -F "/$(basename "$PWD")" | tail -1

Bien, reemplacé {root_of_folders) con .. y funciona perfectamente. No estoy seguro de que sigo la \ $ me da la misma respuesta con y sin ella
Miles

También solo funciona para ese día. p.ej. desde foo / 2017/03/02/0000 dice que el anterior es foo / 2017/03/02/0000. Funciona perfectamente si es el mismo día.
Miles

Hay una diferencia si hay subdirectorios. Pero ya que estás usando .. Debes tener un solo nivel.
xenoid

Eso es porque estás usando .. y no /path/to/foo.
xenoid
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.