2 votos

Script de Bash para crear enlaces simbólicos

Yo soy relativamente nuevo en bash y estoy teniendo algunos problemas con un guión que estoy tratando de escribir. Después de pasar la última hora o así que investigando y probando nuevas técnicas, aún soy incapaz de 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 son tres carpetas: Raw, Editedy Final. Mi objetivo es, con un solo script de bash, crear enlaces simbólicos en mi Escritorio para cada Final carpeta Y cambiarle el nombre a la carpeta padre. Ejemplo: me gustaría /Volumes/Server\ RAID/Photos/2016-10\ Fleet\ Week/Final tener un enlace simbólico en el Escritorio con nombre 2016-10 Fleet Week.

He probado muchas diferentes variedades del código que he publicado para abajo, pero el código que me han incluido fue el más conciso de código (aunque no funcione).

Descripción del código:

  1. cd de Escritorio, de modo que los enlaces simbólicos son creados allí
  2. el uso de una antena a través de las carpetas
  3. crear un enlace simbólico - aquí está el problema: debo incluir el nombre de la carpeta en la ruta de acceso del archivo de alguna manera, pero también agregar \ antes de los espacios de modo que el comando no falla. Sin EMBARGO, he estado recibiendo mensajes de error diciendo que no hay ningún lugar que se llama RAID/Photos que me hace pensar que el guión es de tropiezo en el primer espacio, incluso con la barra diagonal inversa.
  4. Cambio de nombre de Final enlace simbólico a la carpeta de nombre. (Yo asumí que no necesita todos los directorios de aquí porque ya estoy en el Escritorio

    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 por favor me ayude a vaciar este script? (Me preocupa la parte tres, pero yo no diría que no a ayudar con el resto de ella).

3voto

Cuando se ejecuta en problemas con la cáscara de citar, que siempre ayudan a agregar echo declaraciones en los lugares adecuados en el script para ver lo que está pasando.

Echemos un vistazo a esta línea por línea:

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

Esto sólo se ejecuta una vez, y establece f a Volumes/Server RAID/Photos, que probablemente no es lo que usted desea.

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

f se establece la ruta de acceso completa (ver arriba), por lo que este se expande a

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

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

mv Final $f

Ver arriba :-)

Hay varias maneras de abordar este, pero en tu caso me gustaría algo como lo siguiente (para no cumplir con 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 ifs cobertura a los casos donde hay archivos en el directorio de origen o de la Final directorio de falta.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X