Script de Bash para crear enlaces simbólicos

2

Soy relativamente nuevo en bash y estoy teniendo algunos problemas con un script que estoy tratando de escribir. Después de pasar la última hora más o menos investigando y probando nuevas técnicas, todavía no puedo hacer lo que me gustaría.

Mi objetivo es este: tengo una carpeta /Volumes/Server\ RAID/Photos donde guardo todas mis fotos. Cada carpeta se titula YYYY-MM FolderName donde a veces hay espacios en FolderName . Dentro de estas carpetas hay tres carpetas: Raw , Edited y Final . Mi objetivo es, con un solo script de bash, crear enlaces simbólicos en mi Escritorio para cada carpeta Final Y cambiar su nombre a su carpeta principal. Ejemplo: me gustaría que /Volumes/Server\ RAID/Photos/2016-10\ Fleet\ Week/Final tuviera un enlace simbólico en el escritorio llamado 2016-10 Fleet Week .

He probado muchas variedades diferentes del código que he publicado a continuación, pero el código que incluí fue el más conciso (aunque no funcionó).

Descripción del código:

  1. cd to Desktop para que se creen enlaces simbólicos allí
  2. utilizar para bucle para recorrer las carpetas
  3. crear enlace simbólico: aquí está el problema: necesito incluir el nombre de la carpeta en la ruta del archivo de alguna manera, pero también agregar \ antes de los espacios para que el comando no falle. SIN EMBARGO, he estado recibiendo mensajes de error que dicen que no hay un lugar llamado RAID/Photos , lo que me hace pensar que el script está tropezando en el primer espacio, incluso con la barra invertida.
  4. Cambie el nombre del enlace simbólico Final al nombre de la carpeta. (Supuse que no necesitaba directorios completos aquí porque ya estoy en Desktop

    cd Desktop
    for f in /Volumes/Server\ RAID/Photos;
    do ln -s /Volumes/Server\ RAID/Photos/"$f"/Final
    mv Final $f
    done
    

PREGUNTA: ¿Puede alguien ayudarme a eliminar este script? (Me preocupa principalmente la tercera parte, pero tampoco diría que no para ayudar con el resto).

    
pregunta NoahL 17.04.2017 - 20:03

1 respuesta

3

Cuando tenga problemas con las citas de shell, siempre es útil agregar echo en los lugares adecuados de su script para ver qué está pasando.

Veamos esta línea por línea:

for f in /Volumes/Server\ RAID/Photos;

Esto solo se ejecuta una vez, y establece f en Volumes/Server RAID/Photos , que probablemente no es lo que quieres.

do ln -s /Volumes/Server\ RAID/Photos/"$f"/Final

f se establece en la ruta completa (ver arriba), por lo que esto se expande a

ln -s /Volumes/Server\ RAID/Photos//Volumes/Server\ RAID/Photos/Final

que (de nuevo) no es lo que quieres ver aquí.

mv Final $f

Ver más arriba :-)

Hay varias formas de abordar esto, pero en su caso, me gustaría algo como lo siguiente (para superar el desafío de tener que extraer el nombre del directorio de la ruta de origen)

cd /Volumes/Server\ RAID/Photos/
for f in *; do
    if [ -d "$f" ]; then 
        if [ -d "$f"/Final ]; then
            ln -s "/Volumes/Server RAID/Photos/$f/Final" ~/Desktop/"$f"
        fi
    fi
done

Los dos if s cubren los casos en los que hay archivos en el directorio de origen o falta el directorio Final .

    
respondido por el nohillside 17.04.2017 - 20:23

Lea otras preguntas en las etiquetas