我有以下名称的文件
- 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 或者可以访问bash
shell,那么尝试以下操作:
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