Відносний шлях в Автоматизаторі


2

Я хочу зробити Автоматизатор, який копіює набір файлів з папки в іншу папку, на одну папку вгору, а потім дві папки вниз від початкових файлів. Іншими словами: ../Folder1/Folder2. Дія Автоматизатора буде в тій самій папці, що і файли, але коренева папка буде дублюватися та перейменовуватися на декілька комп'ютерів, тому шлях ПОВИНЕН бути відносним.

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

введіть тут опис зображення


Я знаю, що шкаралупа може залякати, але, хоча це можна зробити в Automator, в оболонці це так просто, що ви, можливо, захочете почати отримувати зручніше з неї:cp files*.txt ../Folder1/Folder2
beroe

Забудьте моє німе запитання Дія - це додаток :-)
markhunte

До моєї відповіді додали ще дві версії ..
markhunte

Відповіді:


1

Замість AppleScript ви можете це зробити, додавши модуль Run Shell Script із цим вмістом:

for F in "$@"; do
    cp "$F" "${F%/*/*}/Folder1/Folder2/${F##*/}"
done 

Відредагуйте імена Folder1 / Folder2, щоб відповідати вашому фактичному випадку.

Виберіть як аргументи з Pass Input: спливаюче вікно прямо там, де написано на stdin .

$@зберігає повний шлях усіх вибраних файлів. $F- це шлях кожного окремого файлу, оскільки він обробляється forциклом. Дивним ${F%/*/*}є повний шлях до файла мінус ім'я файлу та його батьківська папка. Дивна ${F##*/}сама назва файлу.

Спершу випробуйте на безпеку!

Зображення сценарію

Інший спосіб зробити це, який, на мою думку, був би простішим у довгостроковій перспективі:

  1. Відкрийте вікно терміналу.
  2. Введіть cdspaceі перетягніть папку, що містить ваші файли, у вікно. (Це вставить шлях до цієї папки. Обов’язково введіть пробіл після того, cdяк перетягніть його.)
  3. Тип cp *Video* ../Folder1/Folder2
  4. Готово!

Отже, ваша інша відповідь: файли cp * .txt ../Folder1/Folder2 простіші та кращі? Ця відповідь за допомогою циклу for-loop більш загальна, оскільки вона не передбачає конкретного розширення ".txt"?
Kaydell

Ну а команда, яку ви вводите кожен раз, коли вам це потрібно, є найбільш гнучкою, більше, ніж for-loop. Я просто наводив *.txtяк приклад спосіб вибору декількох файлів. Це може бути що завгодно. Якщо ви їдете по маршруту Автоматизатор, тоді ви маєте крок використання графічного інтерфейсу для вибору файлів (може бути простіше чи складніше залежно від контексту), але, безумовно, важче змінити Folder1/Folder2призначення, редагуючи сценарій Автоматизатора щоразу, коли захочете використай це.
beroe

Я дивлюсь на ваш сценарій оболонки, і я дійсно не маю уявлення, що з цим робити. Тримання
Бен Дансбі

Я відредагував відповідь. Я нехтував зазначенням того, що as argumentsпотрібно вибрати варіант. Також додано нативну команду оболонки, якщо ви хочете отримати авантюру.
берое

1
У мене все це працює з декількома екземплярами кожного кроку для копіювання різних наборів зображень. Дякую за допомогу! Я б підтримав вас, якби у мене була карма :-)
Бен Дансбі,

0

UPDATE * трохи зменшив код і виправив шлях

Оскільки ви попросили яблучний сценарій ...

on run {input, parameters}
    tell application "Finder"
        set thefolderPath to "folder1:folder2:"
        set mycontainer to (path to me)
            set movePath to folder thefolderPath of container of (path to me)'s container as alias
        duplicate input to movePath

    end tell

end run

Це також усуває дію копіювання, оскільки тут робиться і дублювання.


ОНОВЛЕННЯ 2

З цією версією. Не має значення, де знаходиться додаток. Шлях відпрацьований там, де знаходяться файли.

on run {input, parameters}
    set thefolderPath to "folder1:folder2:"
    tell application "Finder"
        set thisItem to item 1 of input as alias
         set movePath to folder thefolderPath of container of (thisItem)'s container as alias
        duplicate input to movePath

    end tell

end run

ОНОВЛЕННЯ 3

Ця версія є такою ж, як оновлення 2. Але буде перевірена на вашу папку1 та папку2.

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

on run {input, parameters}
    set thefolderPath to "folder1/folder2/"
    tell application "Finder"
        set thisItem to item 1 of input as alias
        set movePath to container of (thisItem)'s container as alias
        set theTestPath to ((POSIX path of movePath) & "/" & thefolderPath)

        if (do shell script "/bin/test -e " & quoted form of theTestPath & " ; echo $?") is "1" then
            -- 1 is false
            do shell script "/bin/mkdir -p " & quoted form of theTestPath

        end if
        set theActualPath to (POSIX file theTestPath) as alias
        duplicate input to theActualPath

    end tell

end run

Дякуємо за сценарій! На жаль, він працює лише тоді, коли я запускаю його з Automator, тому файли зберігаються в папці Applications (після встановлення належної структури папок у програмі Applications). Коли я намагаюся запустити його з Finder (навіть якщо він знаходиться в папці Applications), я отримую діалогове вікно, яке повідомляє мені про помилку Applescript.
Бен Дансбі


AH Я оновив його. Я не
сподівався, що у

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

Привіт Марку, дуже дякую за роботу над цим. Вище відповідь Берое працював на мене, але я буду вивчати вашу відповідь, так як я думаю, що це може бути корисним в інших ситуаціях. Я використовую це для того, щоб зробити цілу купу зображень, кожне з яких має по одному або декілька "тегів" у своїх іменах файлів, і триагувати їх у різних папках на основі своїх тегів. Вся ця річ повинна бути портативною, оскільки вона в кінцевому підсумку буде копіюватися, перейменовуватися та переміщуватися до багатьох різних комп'ютерів.
Бен Дансбі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.