Windows 批处理文件移动特定文件
我有大量使用此模板的文件:Windows 批处理文件移动特定文件,windows,batch-file,Windows,Batch File,我有大量使用此模板的文件: example1.part001.rar example1.part002.rar example1.part003.rar ... example2.part001.rar example2.part002.rar example2.part003.rar ... 有时“part”后面只有两个数字 我正在尝试创建一个批处理文件,它首先生成名为“example n”的n个目录(n表示文件组的数量),然后将所有相关文件移到其中。 我会解释得更好 我有 cat.par
example1.part001.rar
example1.part002.rar
example1.part003.rar
...
example2.part001.rar
example2.part002.rar
example2.part003.rar
...
有时“part”后面只有两个数字
我正在尝试创建一个批处理文件,它首先生成名为“example n”的n个目录(n表示文件组的数量),然后将所有相关文件移到其中。
我会解释得更好
我有
cat.part01.rar
cat.part02.rar
cat.part03.rar
dog.part001.rar
dog.part002.rar
mouse.part01.rar
mouse.part02.rar
mouse.part03.rar
mouse.part04.rar
我想首先创建目录“cat”、“dog”和“mouse”,然后将所有相关文件移到其中(我的意思是“foldername”中的所有“foldername.part*.rar”),然后将“cat.part*.rar”文件移到“cat”文件夹中,以此类推。
文件很多,文件名非常不同,而且是随机的
有人能帮我吗?谢谢在这里,我通过将文件名按“.”拆分得到一个组列表。然后我得到第一列的uniq值。对于每个结果,我创建目录。然后将所有文件移动到目录中
#/usr/bin/sh
groupnames=(`ls *.rar | awk -F"." '{print $1}' | uniq`)
for i in ${groupnames[*]}; do
mkdir $i
mv $i.*.rar ./$i/
done
编辑:
测试的示例文件:
球。第1部分。rarball.part2.rar 类别零件01.rar
cat.part02.rar dog.part001.rar
dog.part002.rar 脚本创建文件夹ball、cat、dog,然后将文件移动到各自的文件夹中,并在文件名中使用partX、partXY和partXYZ
@echo off
@break off
@title Batch file move specific files
@color 0a
@cls
setlocal EnableDelayedExpansion
if "%~1" NEQ "" (
set "WORKINGDIR=%~1"
) else (
set "WORKINGDIR=!CD!"
)
if not exist "!WORKINGDIR!\*.rar" (
set "WORKINGDIR=!CD!"
)
if not exist "!WORKINGDIR!\*.rar" (
echo There are no winrar files in this directory
echo.
echo Exiting...
echo.
ping -n 4 localhost>nul
pause
exit
)
for %%a in ( "!WORKINGDIR!\*.rar" ) do (
set "name=%%~nxa"
if "!name:~-4!" EQU ".rar" (
set "name=!name:~0,-4!"
)
if "!name:~-8,5!" EQU ".part" (
echo !name:~-7! | find ".">nul
if "!errorlevel!" NEQ "0" (
set "name=!name:~0,-8!"
) else (
set "skip=yes"
)
) else if "!name:~-7,5!" EQU ".part" (
echo !name:~-6! | find ".">nul
if "!errorlevel!" NEQ "0" (
set "name=!name:~0,-7!"
) else (
set "skip=yes"
)
) else if "!name:~-6,5!" EQU ".part" (
echo !name:~-5! | find ".">nul
if "!errorlevel!" NEQ "0" (
set "name=!name:~0,-6!"
) else (
set "skip=yes"
)
)
if not defined skip (
set "skip=no"
)
if "!skip!" EQU "no" (
if not exist "!WORKINGDIR!\!name!\" (
mkdir "!WORKINGDIR!\!name!\"
)
move /y "!WORKINGDIR!\%%~nxa" "!WORKINGDIR!\!name!\%%~nxa"
)
set "skip=no"
)
pause
exit
这也应该做到,并用
处理文件名代码>也在其中
@echo off
for %%a in (*.rar) do (
if exist "%%a" for %%b in ("%%~na") do (
md "%%~nb" 2>nul
move "%%~nb.part*.rar" "%%~nb" >nul
)
)
pause
你应该创建一个脚本,询问你遇到的具体问题,而不是要求某人为你做全部工作……我向你保证我已经尝试过for,dir,但我找不到解决方案……太完美了!非常感谢。我只需要用“移动”代替“复制”。简单、整洁、简短,这就是我一直在寻找的解决方案!再次感谢你a你把问题作为答案,请哦,对不起,我发现了一个问题。。。许多文件都有“abc.def.ghi.part01.rar”这样的名称,所以不能使用分隔符“.”。。。我试着把“.part”作为分隔符,但它认为,.p,a,r,t是分开的,而不是单个单词。。。我怎样才能解决这个问题?谢谢,如果你能再多一级(aaa.bbb.ccc.rar),请看编辑。但是如果你能有(aaa.bbb.ccc.dddd.rar),那么它将不起作用。新编辑:现在你可以有“aaa.bbb.ccc.ddd.eee.rar”它将起作用。我想这是针对Linux的,我正在寻找Windows。。。无论如何谢谢你!很有效,谢谢!用户sachadee找到了一个较短的解决方案,但最终结果是相同的。也许你的代码有更多的东西,因为它是最长的?是的,没错。我编写了一个更大的代码,以避免可能出现的错误。我想象了某些带有点的文件名可能会出现的情况。在开始时,还有一部分用于处理目录作为参数,例如,您可以调用script.bat“Directory”作为script.bat的参数%1传递,但是如果您直接调用script.bat,它使用当前目录工作,因此您可以将脚本与文件一起放在文件夹中并运行良好,还可以检查WinRAR文件夹中是否有文件。我最大的原因是,通常在发布代码批处理脚本时,很少编程,所以要做必要的检查,只需使代码工作,我总是试图在代码中保持兼容性和更高的可靠性。就像我说的,这不是因为代码有效,你想说代码是正确的。良好的编程实践,即使在批处理脚本中也是可能的。
@echo off
@break off
@title Batch file move specific files
@color 0a
@cls
setlocal EnableDelayedExpansion
if "%~1" NEQ "" (
set "WORKINGDIR=%~1"
) else (
set "WORKINGDIR=!CD!"
)
if not exist "!WORKINGDIR!\*.rar" (
set "WORKINGDIR=!CD!"
)
if not exist "!WORKINGDIR!\*.rar" (
echo There are no winrar files in this directory
echo.
echo Exiting...
echo.
ping -n 4 localhost>nul
pause
exit
)
for %%a in ( "!WORKINGDIR!\*.rar" ) do (
set "name=%%~nxa"
if "!name:~-4!" EQU ".rar" (
set "name=!name:~0,-4!"
)
if "!name:~-8,5!" EQU ".part" (
echo !name:~-7! | find ".">nul
if "!errorlevel!" NEQ "0" (
set "name=!name:~0,-8!"
) else (
set "skip=yes"
)
) else if "!name:~-7,5!" EQU ".part" (
echo !name:~-6! | find ".">nul
if "!errorlevel!" NEQ "0" (
set "name=!name:~0,-7!"
) else (
set "skip=yes"
)
) else if "!name:~-6,5!" EQU ".part" (
echo !name:~-5! | find ".">nul
if "!errorlevel!" NEQ "0" (
set "name=!name:~0,-6!"
) else (
set "skip=yes"
)
)
if not defined skip (
set "skip=no"
)
if "!skip!" EQU "no" (
if not exist "!WORKINGDIR!\!name!\" (
mkdir "!WORKINGDIR!\!name!\"
)
move /y "!WORKINGDIR!\%%~nxa" "!WORKINGDIR!\!name!\%%~nxa"
)
set "skip=no"
)
pause
exit
@echo off
for %%a in (*.rar) do (
if exist "%%a" for %%b in ("%%~na") do (
md "%%~nb" 2>nul
move "%%~nb.part*.rar" "%%~nb" >nul
)
)
pause