2012-04-18 22 views
11

Sto provando a cambiare tutti i nomi dei file in una cartella corrente e sto cercando di ottenere ciò rimuovendo il prefisso dei file (ogni file ha un prefisso comune) o cambiando i loro nomi al loro conteggio (se ci sono 5 file, i nomi dei file saranno 1.txt 2.txt 3.txt 4.txt 5.txt).Rinomina (o rimuovi il prefisso) più file per ciascun numero

Ora ho trovato il comando ren in cmd e ho giocato con esso un po 'ma finora non sono stato in grado di ottenere il risultato e posso farlo solo in cmd, quindi nessun file batch può essere usato.

Questo è il più vicino che ho ottenuto, ma aggiunge solo un prefisso:

FOR %f IN (*.*) DO ren %f prefix%f 

Ho provato a fare il contrario:

FOR %f IN (*.*) DO ren prefix%f %f 

Ma, naturalmente, non ha funzionato così ho ora sto chiedendo aiuto e qualche spiegazione se possibile (mi piace capire come funzionano queste cose). Grazie in anticipo per qualsiasi aiuto.

+0

Questi comandi non sembrano funzionare correttamente con directory di grandi dimensioni. Continua ad aggiungere il prefisso ai file a cui ha già aggiunto il prefisso. – hnviet

risposta

24

Non capisco perché non è possibile utilizzare un file batch. Ma ecco una soluzione che dovrebbe funzionare con la maggior parte dei nomi di file.

critico - prima è necessario assicurarsi di avere un nome di variabile non definita, userò fname

set "fname=" 

successivo è il comando per effettivamente fare la ridenominazione. Non funzionerà correttamente se fname è già definito.

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%") 

La variabile fname è definita per ogni iterazione e quindi la sintassi %fname:*prefix=% sostituisce la prima occorrenza di "prefisso" con niente. La cosa complicata è che Windows tenta prima di espandere% fname% quando il comando viene analizzato per la prima volta. Certo che non funzionerà perché non è stato ancora definito. Sulla riga di comando le percentuali vengono conservate se la variabile non viene trovata. Il CALL causa una fase di espansione aggiuntiva che si verifica dopo la variabile è stata impostata, quindi l'espansione funziona.

Se fname è definito prima dell'esecuzione del comando, tenterà semplicemente di rinominare lo stesso file per ogni iterazione anziché il valore che viene assegnato all'interno del ciclo.

Se si desidera eseguire di nuovo il comando con un prefisso diverso, sarà necessario cancellare nuovamente la definizione.

EDIT - Ecco un file batch denominato "RemovePrefix.bat" che fa il lavoro

::RemovePrefix.bat prefix fileMask 
@echo off 
setlocal 
for %%A in ("%~1%~2") do (
    set "fname=%%~A" 
    call ren "%%fname%%" "%%fname:*%~1=%%" 
) 

Supponete di avere file di nome come "prefixName.txt", allora si dovrebbe utilizzare lo script eseguendo

RemovePrefix "prefix" "*.txt" 

Il file batch rinominerà i file nella directory corrente. Il file batch dovrà anche essere nella directory corrente, a meno che il file batch non esista in una directory che si trova nella variabile PATH. Oppure puoi specificare il percorso completo del file batch quando lo chiami.

Le regole per l'espansione sono diverse in un file batch.Le variabili FOR devono essere referenziate come %% A anziché% A, e %% fname %% non viene espansa inizialmente, ma le percentuali doppie vengono convertite in percentuali singole e quindi% fname% viene espanso dopo CALL. Non importa se fname è già definito con il file batch. SETLOCAL rende la definizione di fname temporanea (locale) nel file batch.

+0

Perfetto, grazie mille per la spiegazione aggiuntiva! Modifica: proprio come una richiesta aggiuntiva, potresti pubblicare un esempio se potesse essere fatto in un file batch? – Shadow

+0

Non so come sia stato perfetto - c'era un brutto bug in cui% f si stava confondendo con% f in% fname%. Tutto risolto adesso :) – dbenham

+0

Quale modifica devo fare in questo script in modo che cerchi '' .txt "' in ogni directory figlia della directory corrente e rimuova il 'prefisso' dato? – Kushal

23

Una soluzione molto più semplice è fornita in
https://superuser.com/a/871799/497147

ho copiato qui per facilitare l'accesso.

Dimentica script complicati per questo.

rename è un comando molto vecchio e mai completato correttamente. Se non lo usi correttamente, il risultato potrebbe sorprendervi.

Ad esempio, per rimuovere un prefisso abcd da abcd1.txt, abcd2.txt, abcd3.txt ecc al fine di ottenere 1.txt, 2.txt, 3.txt semplicemente utilizzare

rename "abcd*.txt" "////*.txt" 

è necessario lo stesso numero di / come il numero di caratteri iniziali ti piacerebbe rimuovere.

Posizionare virgolette doppie per entrambi gli argomenti.

+0

Salvatore del giorno. –

+0

Tecnica molto interessante e bizzarra. Ho aggiornato il mio [In che modo il comando RENAME di Windows interpreta i caratteri jolly?] (Https://superuser.com/q/475874/109090) Domande e risposte SuperUser con queste informazioni, anche se tecnicamente, '/' non funziona come un selvaggio carta. – dbenham

+0

Incredibilmente semplice e perfettamente funzionante. Si noti che il numero di "/" non è correlato al numero di caratteri specificato nell'espressione corrispondente. Un altro esempio: 'rinomina" IM *. * "" ////*.* "' corrisponde a un prefisso a 2 caratteri e rimuove 4 caratteri – PaoloC