Баш сценарій для створення символічних посилань


2

Я порівняно новачок у баші і у мене виникають певні проблеми зі сценарієм, який я намагаюся написати. Провівши останню годину або близько того досліджуючи та спробувавши нові методи, я все ще не можу зробити те, що хотілося б.

Моя мета така: у мене папка, в /Volumes/Server\ RAID/Photosякій я зберігаю всі свої фотографії. Кожна папка має титул, YYYY-MM FolderNameде іноді є пробіли FolderName. У цих папках три папки: Raw, Editedі Final. Моя мета - за допомогою одного сценарію bash створити символічні посилання на моєму робочому столі для кожної Finalпапки І перейменувати її у свою батьківську папку. Приклад: Я хотів би /Volumes/Server\ RAID/Photos/2016-10\ Fleet\ Week/Finalмати символічне посилання на імені Desktop 2016-10 Fleet Week.

Я спробував багато різних різновидів коду, який я розмістив нижче, але код, який я включив, був самим стислим кодом (хоча він не працював).

Опис коду:

  1. CD на робочий стіл, щоб там створювались посилання
  2. використовувати для циклу циклу через папки
  3. створити symlink - ось проблема: мені потрібно якось включити ім'я папки в шлях до файлу, але також додати \перед пробілами, щоб команда не вийшла з ладу. З цього часу я отримую повідомлення про помилки, кажучи про те, що немає місця, RAID/Photosяке називається, що змушує мене думати, що сценарій спотикається на першому просторі, навіть із зворотною косою рисою.
  4. Змініть ім'я Finalсимвольного посилання на ім'я папки. (Я припускав, що тут мені не потрібні повні каталоги, тому що я вже в Desktop

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

ЗАПИТАННЯ: Може хтось, будь ласка, допоможе мені очистити цей сценарій? (Я в основному стосується частини третьої, але я б і не сказав "ні", щоб допомогти з рештою).


Поставте подвійні лапки навколо команди $fв команді mv. Навіть якщо він буде належним чином уникнути, коли його помістити в змінну, він розшириться на кілька слів, коли ви будете використовувати його без цитування.
0942v8653

@ user3439894 хороший момент! Питання відредаговано так, щоб відображати наміри (лише посилання на остаточні папки)
NoahL

Відповіді:


3

Натрапляючи на проблеми з цитуванням оболонок, завжди допомагає додавати echoзаяви у відповідні місця у вашому сценарії, щоб побачити, що відбувається.

Давайте розглянемо цей рядок за рядком:

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

Це працює тільки один раз, і встановлює fв Volumes/Server RAID/Photos, що , ймовірно , не те , що ви хочете.

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

f встановлюється на повний шлях (див. вище), так що це розширюється до

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

що (знову ж таки) - не те, що ви хочете бачити тут.

mv Final $f

Дивись вище :-)

Існують різні способи вирішити це, але у вашому випадку я хотів би зробити щось на кшталт наступного (щоб вирішити проблему необхідності вилучення імені каталогу із вихідного шляху)

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

Вони ifохоплюють випадки, коли у вихідному каталозі є файли або Finalкаталог відсутній.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.