Automator: Sostituire Caratteri Invalidi

Mac OS X e le sue Applicazioni

Moderatore: ModiMaccanici

Avatar utente
Bacchinif
Stato: Non connesso
Maccanico assiduo
Maccanico assiduo
Avatar utente
Iscritto il: sab, 23 nov 2013 01:05
Messaggi: 160
Località: Napoli

Top

Salve a tutti, proverò a porvi in maniera semplice il mio quesito mediamente complesso:

OBIETTIVO
Devo caricare circa 800 GB da un HDD meccanico (installato nel mio iMac, in configurazione Dual Drive con un SSD) al server OneDrive (OneDrive for Business). Purtroppo dal momento che il mio iMac non supporta macOS Mojave e che non ho intenzione di "duplicare" gli 800 GB di files fisicamente nella cartella OneDrive (presente su SSD) facendo il classico "caricamento da client" devo necessariamente caricare i files da browser (Chrome).
Fin qui tutto okay, con le dovute precauzioni: il browser potrebbe crashare ed essere più instabile nella connessione.

Sorvoliamo per un attimo questo problema ed arriviamo a quello più serio e già riscontrato:

PROBLEMA
Il caricamento da browser di OneDrive (ma credo anche da client) non accetta i files con i seguenti caratteri:

" * : < > ? / \ | [OneDrive Standard]

~ " # % & * : < > ? / \ { | } [OneDrive Server]

fonte: Microsoft

Come ben potete immaginare, dovendo fare il backup di un intero HDD sul cloud, ci sono migliaia di files con caratteri non validi (invece accettati dal Finder del Mac). Non è pensabile andarli a sostituire uno ad uno e, quindi, ho cercato online uno script (da inserire in Automator) che sostituisca i caratteri incriminati con caratteri accettati.

SOLUZIONE PARZIALE

Lo script trovato è quello sotto spoiler, tenendo a mente che la fonte da cui l'ho preso riporta una formattazione diversa (probabilmente corretta) ed i colori (grigio e rosso per renderne più chiara la lettura).

Codice: Seleziona tutto

#!/usr/bin/env bash

# The following characters are considered impermissible in a basename:
#
#  - Left Square Bracket:   [
#  - Right Square Bracket:  ]
#  - Left Parenthesis:      (
#  - Reverse Solidus:       \
#  - Colon:                 :
#  - Quotation Mark         "
#  - Single Quotation Mark  '
#  - Asterisk               *
#  - Question Mark          ?
#  - Less-than Sign         <
#  - Greater-than Sign      >
#  - Vertical Line          |
#  - Plus Sign              +
#  - Space Character
#  - UnderScore             _
#
#  1. Sed is utilized for character replacement therefore characters listed
#     in the bracket expression [...] must be escaped as necessary.
#  2. Any forward slashes `/` in the basename are substituted by default with
#     a Colon `:` at the shell level - so it's unnecessary to search for them.
#
declare -r IMPERMISSIBLE_CHARS="[][()\\:\"'*?<>|+_ ]"
declare -r REPLACEMENT_STRING="-"

# Obtain the POSIX path of each selected item in the `Finder`. Input must
# passed to this script via a preceding `Get Selected Finder Items` action
# in an Automator Services workflow.
declare selected_items=("$@")

declare -a sorted_paths
declare -a numbered_paths

# Prefix the POSIX path depth level to itself to aid sorting.
for ((i = 0; i < "${#selected_items[@]}"; i++)); do
  numbered_paths+=("$(echo "${selected_items[$i]}" | \
      awk -F "/" '{ print NF-1, $0 }')")
done

# Sort each POSIX path in an array by descending order of its depth.
# This ensures deeper paths are renamed before shallower paths.
IFS=$'\n' read -rd '' -a sorted_paths <<<  \
    "$(printf "%s\\n" "${numbered_paths[@]}" | sort -rn )"


# Logic to perform replacement of impermissible characters in a path basename.
# @param: {Array} - POSIX paths sorted by depth in descending order.
renameBaseName() {
  local paths=("$@") new_basename new_path

  for path in "${paths[@]}"; do

    # Remove numerical prefix from each $path.
    path="$(sed -E "s/^[0-9]+ //" <<< "$path")"

    # Replaces impermissible characters in path basename
    # and subsitutes uppercase characters with lowercase.
    new_basename="$(sed "s/$IMPERMISSIBLE_CHARS/$REPLACEMENT_STRING/g" <<< \
        "$(basename "${path}")" | tr "[:upper:]" "[:lower:]")"

    # Concatenate original dirname and new basename to form new path.
    new_path="$(dirname "${path}")"/"$new_basename"

    # Only rename the item when:
    # - New path does not already exist to prevent data loss.
    # - New basename length is less than or equal to 255 characters.
    if ! [ -e "$new_path" ] && [[ ${#new_basename} -le 255 ]]; then
      mv -n "$path" "$new_path"
    fi
  done
}

renameBaseName "${sorted_paths[@]}"
Lo script funziona senza problemi, ma c'è un MA... ed è qui che sorge il mio problema: alcuni dei caratteri "non permessi" dallo script scritto, in realtà, sono permessi da OneDrive e non è certo mio interesse andare a sostituire anche quelli che potrebbero essere caricati (come parentesi tonde o quadre, che invece, vorrei mantenere nei nomi dei files).

QUESITO
Qualcuno sa aiutarmi a modificare lo script, andando a contrassegnare come "caratteri proibiti" solo quelli indicati da Microsoft in rosso?

Purtroppo sono una capra e non saprei farlo da solo (ci ho provato, ma non ha funzionato).

Avatar utente
faxus
Stato: Non connesso
Pro-Expert 
Pro-Expert 
Avatar utente
Iscritto il: lun, 02 giu 2014 15:12
Messaggi: 30459
Località: Circondato dalle bufale

Top

Contatta:
Bacchinif ha scritto:
sab, 18 gen 2020 09:48
... la fonte da cui l'ho preso riporta una formattazione diversa (probabilmente corretta) ed i colori (grigio e rosso per renderne più chiara la lettura)...
Tu hai usato TextEdit.

Devi semplicemente usare un editor di testo avanzato.
Prova con BBEdit (gratuito), Smultron, Fraise ecc

Avatar utente
Bacchinif
Stato: Non connesso
Maccanico assiduo
Maccanico assiduo
Avatar utente
Iscritto il: sab, 23 nov 2013 01:05
Messaggi: 160
Località: Napoli

Top

faxus ha scritto:
sab, 18 gen 2020 10:30
Bacchinif ha scritto:
sab, 18 gen 2020 09:48
... la fonte da cui l'ho preso riporta una formattazione diversa (probabilmente corretta) ed i colori (grigio e rosso per renderne più chiara la lettura)...
Tu hai usato TextEdit.

Devi semplicemente usare un editor di testo avanzato.
Prova con BBEdit (gratuito), Smultron, Fraise ecc
Ciao @faxus. Spero che vada tutto bene.

Quando ho parlato di "formattazione diversa" mi riferivo a quella incollata qui in iMaccanici. Quando la incollo nel "run shell" di Automator va bene.

La mia richiesta era un'altra: modificare lo script, ad hoc, per intervenire SOLO sui caratteri "vietati" da OneDrive e non da TUTTI quelli riportati nello script. E' questo che non so fare.

EDIT: Ho scaricato BBEdit, ma non lo posso usare (richiede Mojave ed io sono fermo ad High Sierra).

Avatar utente
faxus
Stato: Non connesso
Pro-Expert 
Pro-Expert 
Avatar utente
Iscritto il: lun, 02 giu 2014 15:12
Messaggi: 30459
Località: Circondato dalle bufale

Top

Contatta:
Lascia stare BBEdit, allora.
(In ogni caso sul sito ci sono le versioni per i sistemi precedenti a Mojave, la v.12)

Difficile darti la soluzione, perché è complicato fare un test, poi...

Tieni presente che in genere basta eliminare i caratteri da escludere nelle righe non commentate.
Ma poi credo che siano coinvolti nei percorsi e concatenazioni.
E allora non posso esserti utile, ci vuole uno specialista

Avatar utente
Bacchinif
Stato: Non connesso
Maccanico assiduo
Maccanico assiduo
Avatar utente
Iscritto il: sab, 23 nov 2013 01:05
Messaggi: 160
Località: Napoli

Top

faxus ha scritto:
sab, 18 gen 2020 11:27
Lascia stare BBEdit, allora.
(In ogni caso sul sito ci sono le versioni per i sistemi precedenti a Mojave, la v.12)

Difficile darti la soluzione, perché è complicato fare un test, poi...

Tieni presente che in genere basta eliminare i caratteri da escludere nelle righe non commentate.
Ma poi credo che siano coinvolti nei percorsi e concatenazioni.
E allora non posso esserti utile, ci vuole uno specialista
E' quello che ho provato io.
Ho eliminato le prime righe, togliendo i caratteri che volevo lasciare... però poi non ha funzionato.

Qualche altra soluzione per caricare questi benedetti 800 GB su OneDrive?

EDIT: Sono riuscito ad escludere i caratteri che non volevo fossero eliminati.

Ci sono solo una serie di cose che ancora non vanno:

- Quando "runno" lo script, i file che subiscono la modificano diventano tutti scritti in maiuscolo abbattendo anche le maiuscole.

- Purtroppo il "servizio" (alias, lo script) non funziona su una cartella (e le sue sottocartelle ed i suoi files), ma solo con una selezione multipla di files (e.s. seleziono 100 immagini) e poi faccio tasto destro --> insomma, una bella rogna per 800 GB di roba... quando mi basterebbe fare: tasto destro su HDD, applica servizio.

Avatar utente
Bacchinif
Stato: Non connesso
Maccanico assiduo
Maccanico assiduo
Avatar utente
Iscritto il: sab, 23 nov 2013 01:05
Messaggi: 160
Località: Napoli

Top

Nessuno?

Rispondi

Torna a “Software”

Chi c’è in linea

Visitano il forum: Google [Bot] e 19 ospiti