Como colocar o texto em massa do nome do arquivo em vários arquivos existentes

0

Eu tenho arquivos com o seguinte nome

  • GB_20141001
  • JPN_20141001
  • GB_20141002
  • TH_20141003

Eu quero que a data no final do nome do arquivo seja anexada ao seu conteúdo. O conteúdo de cada arquivo pode ser semelhante a este

ABD10224
CHG20991
GHJ02933

e se tornaria isso:

20141001
ABD10224
CHG20991
GHJ02933

é possível criar um arquivo de lote para fazer isso

    
por Muhaimin 04.11.2014 / 05:59

2 respostas

1

Observação - Nenhum deste código é testado, portanto, pode haver alguns bugs. Mas os conceitos estão todos corretos

Se nenhum dos seus arquivos tiver mais de um _ , então:

@echo off
for /f "eol=_ delims=_ tokens=1,2" %%A in (
  'dir /b /a-d *_????????^|findstr /rx "[^._][^._]*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"'
) do ((
  echo %%B
  type "%%A_%%B"
) >"%%A_%%B.new" & move /y "%%A_%%B.new" "%%A_%%B" >nul )

Se houver mais de um _ , então:

@echo off
setlocal
for /f "eol=_ delims=_ tokens=1,2" %%F in (
  'dir /b /a-d *_????????^|findstr /rx "[^.][^.]*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"'
) do call :processFile "%%F"
exit /b

:processFile
set "file=%~1"
for %%A in ("%file:_=" "%") do set "dt=%%A"
>"%~1.new" (
  echo %dt%
  type %1
)
move /y "%~1.new" %1 >nul
exit /b

Ou, se você receber uma cópia do repl.bat , simplificará:

@echo off
for /f "eol=: delims=: tokens=1,2" %%A in (
  'dir /b /a-d *_????????^|repl "^[^.]+_(\d{8})$" "$&:$1" a'
) do ((
  echo %%B
  type "%%A"
) >"%%A.new" & move /y "%%A.new" "%%A" >nul )
    
por 04.11.2014 / 16:41
0

Se você instalou o Cygwin ou teve acesso a um shell bash , tente o seguinte:

for f in *; do sed -i "1 s/^/${f##*_}\n/" "$f"; done

Como funciona

  • for f in *; do

    Isso inicia um loop sobre todos os arquivos no diretório atual.

  • sed -i "1 s/^/${f##*_}\n/" "$f"

    sed é a ferramenta para editar arquivos. -i informa sed para editar o arquivo no local. 1 informa ao sed para aplicar essa alteração somente na primeira linha. s/^/${f##*_}\n/ é um comando substituto. Normalmente parece algo como s/old/new/ . No nosso caso, o antigo é ^ , que é uma expressão regular que corresponde ao início de uma linha. O início da linha é substituído por ${f##*_}\n/ , em que ${f##*_} é o nome do arquivo com tudo até o último caractere de sublinhado removido e \n é o caractere de nova linha. Isso coloca a data em uma nova linha no início do arquivo

  • done

    Isso marca o final do loop for .

Exemplo

Vamos começar com um diretório com o arquivo de amostra:

$ ls
GB_20141001
$ cat GB_20141001 
ABD10224
CHG20991
GHJ02933

Aplicamos nosso comando:

$ for f in *; do sed -i "1 s/^/${f##*_}\n/" "$f"; done

O arquivo agora tem a data como a primeira linha:

$ cat GB_20141001 
20141001
ABD10224
CHG20991
GHJ02933
    
por 04.11.2014 / 06:22