Copia e incolla un file 200 volte con nuovi nomi


3

Ho una cartella con un file chiamato 'template.xlsx':, e centinaia di file denominati:

  • old_2301 Item 1.xlsx
  • old_2014 Item 2.xlsx
  • old_5321 Item 3.xlsx
  • ...
  • old_3212 Item 200.xlsx

Voglio copiare il file template.xksxe creare 200 nuovi file:

  • 2301 Item 1.xlsx
  • 2014 Item 2.xlsx
  • 5321 Item 3.xlsx
  • 3212 Item 200.xlsx

Ho provato qualcosa del tipo:

Nella cartella, digita Shift+ Maiusc: seleziona "apri qui la finestra di comando"

for %a in (*.*) do copy "template.xlsx" ... ren ...?

Voglio rinominare i template.xlsxfile copiati con lo stesso nome degli altri file, ma con i old_ritagli.

C'è un modo semplice per fare questo?


4
A meno che non sia necessario ridistribuire il codice che lo fa, suggerirei vivamente di imparare un po 'di Python. Il codice è molto più semplice, quindi più veloce da scrivere, più facile da leggere e meno soggetto a bug. Ho colleghi che cercano di fare cose fantasiose a Bash, di solito finisce con mal di testa.
Davidmh,

5
@Davidmh Perché imparare Python quando è un'attività banale per un file batch? Inoltre, Windows 7 non viene fornito con Python o Bash installati.
DavidPostill

@DavidPostill il mio punto è che in Python è più facile, più leggibile e più facilmente esteso, a costo di imparare un po 'di una nuova lingua (a questo livello, dovrebbe essere facile per un programmatore competente come l'OP) e installare (che è abbastanza facile, se non ti interessa distribuirlo). E mentre l'attività originale può essere banale, nella mia esperienza la gente cercherà di espanderla, renderla progressivamente più complicata e finire in un orribile pasticcio di awk e sed (o qualsiasi altra cosa equivalente su Windows), mentre Python aiuta a domare la complessità.
Davidmh,

Inoltre, non sto raccomandando bash, lo considero nella stessa categoria di batch. L'ho menzionato perché io e i miei colleghi lavoriamo su Linux.
Davidmh,

@Davidmh Non vedo alcun motivo per usare Python in un negozio di Windows. PowerShell offre la stessa "facilità di apprendimento" ma è più portatile (Vista + dovrebbe funzionare con gli script) e la sintassi IMO è ancora migliore.
Austin T francese,

Risposte:


10

Voglio copiare template.xlsxil nome degli altri file, con old_rimosso

Utilizzare il seguente file batch:

@echo off
setlocal enabledelayedexpansion
rem get list of file names
for /f "usebackq tokens=*" %%i in (`dir /b old_*.xlsx`) do (
  rem save the filename
  set _name=%%i
  rem remove old_ from the name
  set _name=!_name:old_=!
  rem do the copy to the modified name
  copy "template.xlsx" "!_name!"
  )
endlocal

Ulteriori letture


Dove devo digitare questo codice? Come eseguo questo codice?
Sono la persona più stupida il

@DonkeyKingandDonkeyKing In un file batch, che può trovarsi nella directory di interesse. Quindi eseguire il file batch.
DavidPostill

@DonkeyKingandDonkeyKing nel caso in cui non si sappia come creare un file batch: è possibile digitare / incollare il testo in un editor di testo (Blocco note, Blocco note ++ o qualsiasi altra cosa) e salvarlo come 'filename.bat'anziché 'filename.txt'. Quindi puoi semplicemente fare doppio clic ed eseguirlo come se fosse un programma normale (.exe).
Stewie Griffin,


6

Devi usare i file nominati old_*come origine del nome e dividerli nel carattere di sottolineatura.

@Echo off
For /f "tokens=1* delims=_" %%A in (
    'Dir /B /A-D "old_* Item *.xlsx"'
) Do Echo Copy template.xlsx "%%B"

Se l'output sembra OK, rimuovere l'eco davanti alla copia.

Spiegazione dell'analisi per le opzioni / f:

nome file old_2301 Articolo 1.xlsx
delims _
token 1 _ * (resto)
per var %% A %% B

Una variante per la riga di comando senza batch:

For /f "tokens=1* delims=_" %A in ('Dir /B /A-D "old_*.xlsx"') Do Copy template.xlsx "%B"

Mi immagino che questo funziona come un fascino, ma ho finito per usare la risposta di David così ho accettato la sua :) Comunque, grazie! :)
Stewie Griffin,

Speedwiese non c'è una grande differenza in quanto la copia impiegherà la maggior parte del tempo. Aggiunta una variante della linea cmd, quindi non è necessario alcun batch.
LotPings

4

A meno che non volessi davvero un programma che potessi eseguire più e più volte, se questo fosse solo una tantum o un po 'fuori uso, avrei usato Notepad ++ o qualsiasi altro editor di testo con blocco copia e incolla. Aprire un prompt dei comandi nella relativa directory e digitare dir/b > 1.txt, che si traduce ad esempio in:

D:\MiscJunk\1>type 1.txt
1.txt
old_2014 Item 2.txt
old_2301 Item 1.txt
old_5321 Item 3.txt
template.txt

Modifica 1.txt in Notepad ++ e aggiungi tutte queste righe necessarie:

copy template.txt ""
copy template.txt ""
copy template.txt ""

Blocca copia (tasti freccia Alt Shift) il testo:

2014 Item 2.txt
2301 Item 1.txt
5321 Item 3.txt

e incollalo tra le virgolette:

copy template.txt "2014 Item 2.txt"
copy template.txt "2301 Item 1.txt"
copy template.txt "5321 Item 3.txt"

Quindi, dopo aver verificato che i comandi siano corretti e regolati di conseguenza, basta copiare e incollare quei comandi nel prompt dei comandi, ottenendo:

D:\MiscJunk\1>dir/b
2014 Item 2.txt
2301 Item 1.txt
5321 Item 3.txt
...

Questo metodo è ultra-semplice senza bisogno di debug e c'è molto poco che può andare storto. Annullare blocchi di comandi in Notepad ++ è qualcosa che faccio abbastanza regolarmente.


Ho usato prima il metodo di David, ma alla fine ho dovuto rinominarli di nuovo ... Questo è stato perfetto la seconda volta :) Grazie mille!
Stewie Griffin,
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.