Cambia più nomi di file sostituendo un carattere


29

Ho più file denominati come that : screenshot 13:25.png
Windows che fatica ad aprire questi file probabilmente a causa del ":".

Come posso sostituirlo?


2
Puoi forse accettare una risposta per contrassegnare la domanda come risolta? Questo aiuterà molto altri utenti.
MERose,

Risposte:


52

In un terminale, cdnella directory giusta ed eseguirlo.

rename 's/\:/-/g' *.png -vn

Questo visualizzerà in anteprima la ridenominazione. Dovrebbe sostituire :con -.

Se sembra corretto, rimuovi il ndalla fine e quindi farà la rinomina reale.

Nota : le versioni di Ubuntu precedenti alla 17.04 non vengono fornite con rename, ma è ancora disponibile nei repository predefiniti, quindi utilizzare sudo apt install renameper ottenerlo


Grazie per la risposta. Ho provato e ho questo problema: modello di sostituzione non terminato alla riga 1 (eval 1)
user236152

@ user236152 Mi dispiace, sono diventato un po 'arrabbiato con le barre rovesciate in fuga (era sul pilota automatico!). Rimosso un paio e dovrebbe essere valido ora.
Oli

Forse un semplice script Nautilus che sostituisce tutti questi caratteri che potrebbero causare problemi in altre piattaforme (in esecuzione su tutti i file selezionati) potrebbe essere utile per le persone "multipiattaforma".
Sadi,

2
Perché usarlo Ti mostra cosa sta facendo (rende più facile invertire se commetti un errore). Perché alla fine? Solo così puoi rimuoverlo (o il n) facilmente.
Oli

1
@nightcrawler Dovresti essere in grado di concatenare i ricambi completamente separati:rename 's/\:/-/g; s/%28/ /g; s/%29//g' ...
Oli

10

Ecco una soluzione bash pura:

for i in *:*; do
    mv "$i" "${i//:/_}"
done

Il ${var//pattern/replacement}formato sostituirà tutte le occorrenze di patterncon replacementnella variabile $var. Per ulteriori informazioni sulle capacità di manipolazione delle stringhe di bash, vedere qui .

Se vuoi farlo per più personaggi, puoi semplicemente metterli in una classe di personaggi. Così, per esempio, per sostituire tutti ;, :, =, +, %, ,con sottolineature, si potrebbe fare:

$ ls 
1foo:bar  2foo:bar:baz  3foo;bar  4foo=bar  5foo%bar  6foo,bar  7foo+bar
$ for i in *; do mv "$i" "${i//[:;=%,+]/_}"; done
$ ls
1foo_bar  2foo_bar_baz  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar

Fondamentalmente, l'idea è che [ ]significa any of the characters listed. Quindi, posizionando tutti i personaggi che si desidera sostituire nella classe di personaggi, tutti vengono affrontati contemporaneamente.


Per i caratteri specifici che hai chiesto, le cose sono un po 'più complesse perché alcuni di loro devono essere salvati (sto ignorando il /poiché * nix non lo consente nei nomi di file non più di Windows, quindi non sarà un problema):

$ ls
1foo<bar  2foo>bar  3foo:bar  4foo\bar  5foo|bar  6foo*bar  7foo?bar  8foo"bar  9foo'bar
$ for i in *; do mv "$i" "${i//[<>:\\|*\'\"?]/_}"; done
$ ls
1foo_bar  2foo_bar  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar  8foo_bar  9foo_bar

Nota che sono sfuggito a \, 'e "aggiungendo un \davanti a ciascuno.


Questo può essere migliorato per sostituire diversi singoli personaggi (ad esempio tutti quelli che non sono accettabili da Windows) con altri?
Sadi,

1
@Sadi vedi la risposta aggiornata.
terdon,

Fondamentalmente ci sono nove: "<>:" / \ | ? * "
Sadi,

@Sadi vedi la risposta aggiornata.
terdon,

Grazie, questo potrebbe aiutare a creare uno script Nautilus che rende i nomi dei file selezionati compatibili con Windows.
Sadi,

2

Se preferisci una GUI, installa pyrenamer:

sudo apt-get install pyrenamer

Quindi eseguilo:

pyrenamer

Ha dozzine di opzioni per motivi e formati di rinomina.


1

Preferisco la GUI ma come estensione di Nautilus, ovvero Nautilus Actions Extra :

sudo add-apt-repository ppa:nae-team/ppa
sudo apt-get update
sudo apt-get install nautilus-actions-extra
nautilus -q

(Vedi www.webupd8.org/2011/12/nautilus-actions-extra-pack-of-useful.html )

Quindi quando selezioni i file da rinominare e fai clic su Rinomina dal menu contestuale, ti vengono offerte molte opzioni per rinominare i file.


0

Il renameutilspacchetto ha un pratico programma chiamato qmvche fornisce la ridenominazione batch interattiva. Lo esegui in una directory o in un elenco di file, genera un file di testo temporaneo contenente i nomi dei file e avvia l'editor preferito. Quando si esce dall'editor, tutti i nomi di file modificati vengono rinominati di conseguenza. qmvtrasforma un problema di ridenominazione batch in un problema di modifica del testo.

In questo caso, puoi usare qmv -f do *:*per modificare i nomi di tutti i file che contengono due punti e quindi il :%s/:/_/gcomando in Vim (o un corrispondente cerca e sostituisci in qualunque editor tu usi).

L' -f doopzione imposta il formato del file di testo in modo che abbia solo il nome del file di destinazione, il che semplifica la ricerca e la sostituzione. Il formato predefinito ha due copie del nome del file su ciascuna riga e si modifica solo la seconda. Ciò gli consente di fare la cosa giusta se hai eliminato o riordinato le righe nel file, ma non è sempre il più semplice. Ci sono anche altri formati.

Con qmv, puoi invece scegliere di reindirizzare il file generato tramite un comando di tua scelta, ad esempio sed, se non desideri la funzionalità interattiva.


0

Ed ecco uno script Nautilus che sostituisce (tutti?) Caratteri incompatibili con Windows con un trattino in tutti i nomi di file selezionati (basato sulla risposta di terdon ;-)

#!/bin/bash
filesall=""
while [ $# -gt 0 ]
    do
        files=`echo "$1" | sed 's/ /\?/g'`
        filesall="$files $filesall"
        shift
    done
for i in $filesall; do mv "$i" "${i//[<>:\\|*\'\"?]/-}"; done

0

Thunar (il gestore di file XFCE) ha una bella funzionalità integrata per rinominare i file in blocco. Ha opzioni per rimuovere / sostituire caratteri, cercare e sostituire, numerare i file e altro.

Installa thunar:

sudo apt-get install thunar

Apri thunar, cerca i tuoi file, selezionali e scegli 'rinomina' (tramite il menu contestuale o F2)


0
@echo off
echo.
echo. How many Characters Do You Want To Remove
echo.
echo. From The End Of The FileName ?
echo.
echo.
set /p variable=" > "
setlocal enabledelayedexpansion
for /f "delims=" %%a in (' dir /b /a-d *.mp3') do (
set oldName=%%a
Set newName=!oldName:~0,-%variable%!.mp3
Ren "!oldName!" "!newName!"
)
exit

Funziona bene e ha un prompt variabile ... Assegna un nome al file simile a _
Truncate

3
Sebbene ciò possa essere corretto, utilizza un linguaggio di scripting batch di Windows. Siamo su AskUbuntu, un sito per domande relative a Ubuntu, e quindi strumenti relativi a Ubuntu. A mio avviso, questa risposta potrebbe non essere necessariamente appropriata qui.
Sergiy Kolodyazhnyy il

Dovresti eseguirlo tramite Wine, ma probabilmente è possibile eseguirlo su Ubuntu ... È solo una risposta strana, tutto qui.
Oli
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.