У меня есть файлы со следующим именем

  • GB_20141001
  • JPN_20141001
  • GB_20141002
  • TH_20141003

Я хочу, чтобы дата в конце имени файла добавлялась к его содержимому. Содержимое каждого файла может выглядеть так

ABD10224
CHG20991
GHJ02933

и станет этим:

20141001
ABD10224
CHG20991
GHJ02933

Можно ли создать пакетный файл, чтобы сделать это

2 ответа2

1

Примечание. Ни один из этих кодов не тестировался, поэтому могут быть некоторые ошибки. Но понятия верны

Если ни один из ваших файлов не содержит более одного _ , то:

@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 )

Если может быть более одного _ , то:

@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

Или, если вы получите копию repl.bat, она упрощается до:

@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 )
0

Если у вас установлен Cygwin или иным образом есть доступ к оболочке bash , попробуйте следующее:

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

Как это устроено

  • for f in *; do

    Это запускает цикл по всем файлам в текущем каталоге.

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

    sed - это инструмент для редактирования файлов. -i говорит sed редактировать файл на месте. 1 говорит sed применить это изменение только к первой строке. s/^/${f##*_}\n/ является замещающей командой. Обычно это выглядит как s/old/new/ . В нашем случае old is ^ который является регулярным выражением, совпадающим в начале строки. Начало строки заменяется на ${f##*_}\n/ где ${f##*_} - это имя файла, в котором все до последнего символа подчеркивания удалены, а \n - символ новой строки. Это помещает дату в новую строку в начале файла

  • done

    Это отмечает конец цикла for .

пример

Давайте начнем с каталога с примером файла:

$ ls
GB_20141001
$ cat GB_20141001 
ABD10224
CHG20991
GHJ02933

Мы применяем нашу команду:

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

Файл теперь имеет дату в качестве первой строки:

$ cat GB_20141001 
20141001
ABD10224
CHG20991
GHJ02933

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .