Copy sequential files from multiple folders into new folder (Win 10)
I've been on a shoot with 6 cameras all shooting the same scene at once. I dump the footage and end up with 6 seperate folders (a folder per camera), and each folder has an equal number of shots, or "takes". What I then want to do is create folders for each "take"...for example Folder Take 1, which includes take 1 from camera A, B, C, D, E, F etc.
Abaixo estão dois exemplos de como concluir o que você está afirmando em sua pergunta que foi confirmada para funcionar conforme você explica no meu ambiente de teste.
Um script NÃO excluirá os takes ou arquivos originais de cada uma das seis pastas de origem da câmera e o outro excluirá os takes originais - não tinha certeza se você quiser excluir o arquivo de origem original leva depois ou não, então eu forneci um com e outro sem.
Você precisará inserir as variáveis para sua necessidade na lógica de script em lote dos exemplos abaixo. Você os salvará em um documento de texto (ou seja, tudo em qualquer um dos que você decidir usar - cada um é um script / arquivo de texto separado) e, em seguida, nomeará <something>.cmd
. Uma vez que é um arquivo cmd
nomeado e você tem suas variáveis plugadas, é só uma questão de clicar duas vezes para iniciá-lo para fazer o que você pede.
Notas variáveis
Adicionei comentários aos scripts em lote esclarecendo as variáveis que você precisará definir (apenas variáveis) e os nomes das pastas para o primeiro FOR loop, mas para esclarecer mais:
- Onde ele está listado como
SET CameraRootDir=
, isso precisará ser configurado para igualar a pasta no nível raiz do caminho completo, onde TODAS as pastas da câmera existem. Presume-se que eles estejam todos na mesma pasta padrão e, a partir daí, todos eles têm sua própria pasta, comoCameraA
,CameraB
e assim por diante. - Onde estiver listado como
SET TakeRootDir=
, será necessário definir essa opção como a pasta de nível de caminho completo na qual você deseja que as pastasTake1
,Take2
,Take3
e assim por diante existam. -
Onde você vê a lógica
FOR %%C IN (
, logo abaixo, você verá os itens listados abaixo deCameraA
,CameraB
e assim por diante. Cada um deles será igual ao nome da pasta ONE ONLY, onde cada número de câmera será o nome de um único nome de pasta abaixo da pasta pai, onde todos eles existem. Basta substituir cada um com os nomes das pastas da câmera onde os arquivos sequenciais ou pegados são salvos— DEIXE O COMMAS embora .CameraA,CameraB,CameraC, CameraD,CameraE,CameraF
-
Se as pastas da sua câmera estiverem localizadas na raiz da unidade "C" como
C:\CameraA
,C:\CameraB
, e assim por diante, convém ter certeza de queSET CameraRootDir=C:\
é assim. será igual aC:\
e os nomes das pastas acima (acima de itens citados em pontos) listados nessa parte da lógica serão iterados por meio dos seis, caso isso ajude a esclarecer; caso contrário, o caminho completo (se não o ROOT da unidade "C") será a pasta PARENT \ ROOT que contém essas pastas. -
Assume-se também que a PRIMEIRA foto ou arquivo de imagem em cada pasta exclusiva da câmera será
Take1
e a próxima depois dissoTake2
e assim por diante nessa ordem seqüencial e é assim que eu tenho a lógica definida agora nos exemplos abaixo.
Outras notas
Por favor, tire um momento e olhe aqui ( Aceitando uma resposta ) para se familiarizar com a aceitação de respostas sobre Superusuário e outras comunidades do Stack Exchange para esse assunto. Se isso funciona para as suas necessidades, aceitar a resposta seria apreciado por gratidão.
Script em lote sem exclusão
@ECHO ON
::: --// The CameraRootDir variable is the root level variable just beneath each separate camera folder name
::: --// The TakeRootDir variable will be the folder location just beneath take1, take2, and so on will be created
SET CameraRootDir=C:\Path\Cameras
SET TakeRootDir=C:\Path\CopiedTakes
IF NOT EXIST "%TakeDir%" MD "%TakeDir%"
::: --// Each item below separate by a comma is the camera folder names just beneath the root level name
::: --// You will need to replace these entries with the actual camera folder name for each of your 6 cameras
FOR %%C IN (
CameraA,CameraB,CameraC,
CameraD,CameraE,CameraF
) DO (
SET TakeCount=0
CALL :CAMERA_MODE "%%~C"
)
GOTO EOF
:CAMERA_MODE
SET CameraDir=%CameraRootDir%\%~1
FOR /F "TOKENS=*" %%T IN (
'"DIR /B /A-D /OD "%CameraDir%\""'
) DO (
CALL :TakeMove "%%~T" "%~1"
)
GOTO EOF
:TakeMove
SET /A TakeCount=%TakeCount%+1
IF NOT EXIST "%TakeRootDir%\Take_%TakeCount%" MD "%TakeRootDir%\Take_%TakeCount%"
ECHO F | XCOPY /F /Y "%CameraDir%\%~1" "%TakeRootDir%\Take_%TakeCount%\%~2_%~1"
GOTO EOF
Script em lote com exclusão
@ECHO ON
::: --// The CameraRootDir variable is the root level variable just beneath each separate camera folder name
::: --// The TakeRootDir variable will be the folder location just beneath take1, take2, and so on will be created
SET CameraRootDir=C:\Path\Cameras
SET TakeRootDir=C:\Path\CopiedTakes
IF NOT EXIST "%TakeDir%" MD "%TakeDir%"
::: --// Each item below separate by a comma is the camera folder names just beneath the root level name
::: --// You will need to replace these entries with the actual camera folder name for each of your 6 cameras
FOR %%C IN (
CameraA,CameraB,CameraC,
CameraD,CameraE,CameraF
) DO (
SET TakeCount=0
CALL :CAMERA_MODE "%%~C"
)
GOTO EXIT
:CAMERA_MODE
SET CameraDir=%CameraRootDir%\%~1
FOR /F "TOKENS=*" %%T IN (
'"DIR /B /A-D /OD "%CameraDir%\""'
) DO (
CALL :TakeMove "%%~T" "%~1"
)
GOTO EOF
:TakeMove
SET /A TakeCount=%TakeCount%+1
IF NOT EXIST "%TakeRootDir%\Take_%TakeCount%" MD "%TakeRootDir%\Take_%TakeCount%"
ECHO F | XCOPY /F /Y "%CameraDir%\%~1" "%TakeRootDir%\Take_%TakeCount%\%~2_%~1"
DEL /Q /F "%CameraDir%\%~1"
GOTO EOF