Terminale Mac - Rinomina mantenendo gli ultimi 6 caratteri

1

Uso il terminale integrato e sono totalmente nuovo in questa codifica, quindi dovrò sapere esattamente cosa scrivere quando apro il terminale. Inoltre, per favore non indirizzarmi a nessun altro software. Quindi diciamo ...

  • Ho una cartella chiamata "Power" sul mio desktop (senza le virgolette attorno ovviamente).

  • In quella cartella ci sono più file .tif nominati come i seguenti:

    • Washington, George-150987.tif
    • Lincoln, Abraham-755103.tif
    • Smith, Jack & Jill-102347.tif
    • Jones-Newman, Martha & John Newman-137881.tif
  • Questi nomi hanno una cosa in comune. Hanno tutti un numero di 6 cifre prima dell'estensione e lo saranno sempre.

  • Voglio un modo per rinominare in batch un grande gruppo di questi file mantenendo solo le ultime 6 cifre. Diavolo, se c'è un codice che potrebbe rinominare mantenendo solo numeri, questo sarebbe IL MIGLIORE, perché in rare occasioni, potrebbe esserci un

    Smith, Jane-108.965 (MRS) .tif

Ma se non c'è un codice per questo, va bene, posso usare un altro software per sbarazzarmene (mrs) in un secondo.

    
posta Jaron Burnette 06.01.2016 - 19:11
fonte

1 risposta

6

Crea prima un backup dei file!

Quindi apri Terminale (, avvia una shell bash se non stai usando la shell predefinita) ed esegui

cd ~/Desktop/Power
\ls | while IFS= read f; do echo mv -vn "$f" "${f/*-/}"; done

Questo non non rinomina nulla ma mostra semplicemente come ogni file verrà rinominato. Se l'output sembra ok, esegui

\ls | while IFS= read f; do mv -vn "$f" "${f/*-/}"; done

PS: questo presuppone che l'unica - nei nomi dei file sia quella subito prima del numero.

Alcune spiegazioni su cosa sta succedendo qui:

  • \ls elenca tutti i file, il \ garantisce che non si verifichi l'espansione dell'alias. L'output viene inserito in una pipe ma non è necessario preoccuparsi dell'output multi-column perché ls in questi casi assume automaticamente -1
  • while ... do; ...; done loop su tutte le linee / file
  • IFS= read f legge un nome di file dall'input standard in $f . Il IFS= garantisce che nessuno dei caratteri sull'input standard confonde read in due valori attesi invece di uno (tecnicamente probabilmente non è richiesto qui, ma è comunque una buona pratica)
  • ${f/*-/} sostituisce le stringhe sul valore di $f , in questo caso sostituisce tutto fino a includere - con la stringa vuota. Vedere man bash (Parameter Expansion) per i dettagli.
risposta data 06.01.2016 - 19:36
fonte

Leggi altre domande sui tag