如何将文件名中的文本批量添加到多个现有文件中

如何将文件名中的文本批量添加到多个现有文件中

我有以下名称的文件

  • GB_20141001
  • JPN_20141001
  • GB_20141002
  • TH_20141003

我希望文件名末尾的日期添加到其内容前面。每个文件的内容可能如下所示

ABD10224
CHG20991
GHJ02933

将会变成这样:

20141001
ABD10224
CHG20991
GHJ02933

是否可以创建批处理文件来执行此操作

答案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

或者,如果你得到一份复制脚本,简化为:

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

答案2

如果你已经安装了 Cygwin 或者可以访问bashshell,那么尝试以下操作:

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/。 在我们的例子中,旧的是,^它是一个在行首匹配的正则表达式。 行首被替换为,${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

相关内容