Come rinominare molti file nella shell bash?


1

Ci scusiamo per la domanda. Ho cercato molto su Internet, ma non sono riuscito a trovare una risposta che funzionasse (anche se c'erano molti suggerimenti).

Quindi, voglio rinominare MOLTI file. Scrivere tutti i nomi di file non è un'opzione. I file si chiamano così:

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

l'inizio è sempre lo stesso e anche .IMA Il numero lungo non è lo stesso per tutti i file. Devo cambiare lo 039 in 036_2, per tutti i file. Il resto dovrebbe rimanere lo stesso.

Ho provato tutti i seguenti comandi (più molti altri), ma non ha fatto nulla:

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl è installato sul sistema linux (ma non sono sicuro di come chiamarlo ... perché se apro un terminale perl non fa nulla).

Mi potete aiutare?

Risposte:


1
for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

Spiegazione:

for file in * ; do _______ ; done

bash eseguirà l'espansione della shell su *per elencare tutti i file nella directory di lavoro. Per ciascuno di questi file, questa struttura di comando imposterà la variabile filein modo che sia uguale al nome del file ed eseguirà il comando tra ; doe; done

mv $file _______

mvè il modo tradizionale di rinominare i file in unix / linux. Rinominerà filein_______

echo $file | sed 's/_039/_036_2'

echo $file | sedinvierà semplicemente " file" allo stdin di sed, dove sedsostituirà "_039" con "_036_2"

Complessivamente: per ogni file nella directory corrente, rinominare il file, sostituendo "_039" con "_036_2"


Oppuremv "$file" "${file/_039/_036_2}"
Joseph R.,

1

Il tuo regexp è incasinato, eccone uno che dovrebbe funzionare.

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

Stai usando lo strumento giusto, non c'è bisogno di trovarlo a meno che tu non abbia delle sottodirectory.


Nota su regexp in sed e rinomina.

Il formato è sXsearch_patternXreplace_patternXoptions( Xpuò essere di qualsiasi carattere). searchPattern è ciò che stai cercando di sostituire, lì per ciò che già esiste, non quello che stai sostituendo.

-w è una sola parola e può essere solo in search_pattern.


Grazie a tutti per le risposte. Sfortunatamente ho ancora problemi (come vedi, non conosco la shell, ma devo fare la ridenominazione per un'altra attività che farò dopo). Quindi, quando provo il tuo suggerimento, non fa nulla. Il 'rinomina' esiste. Ho controllato con "info rename".
Nooooob,

controlla less $(which rename)che dovrebbe essere scritto da Robin Barker, di Larry Wall
ctrl-alt-delor,

0

trova . -name "* 039 *" | rinomina 's / 039 / 036_2 / g'


Grazie! L'ho provato, ma la shell dice: "Aufrug: rinomina von nach Dateien ..." e non fa nulla. Penso che le cose che la shell sais possano essere tradotte come "Chiama: rinomina da a dati"
nooooob,

0

Eseguire il ciclo di tutti i file con il prefisso "HAUPT _...", quindi rinominare utilizzando la sottostringa della shell ${f:15}restituisce la stringa dal 15 ° carattere del nome del file, aggiunto al HAUPT_...prefisso.

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

EDIT - Sembra che la directory con tutti i file contenga anche sottodirectory con lo stesso prefisso HAUPT ... In tal caso, utilizzare il findcomando per filtrare prima solo i file e non le directory.

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

Grazie! Sfortunatamente la shell lamenta che "HAUPT_SIA_036_2" non è una directory. Devo spostare i file in una nuova directory ed eliminare quello vecchio?
Nooooob,

Sì, sarebbe un modo per risolvere il problema (purché vengano spostati solo i file) o vedere la mia modifica.
suspectus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.