标题: [文件操作] [已解决]批处理如何复制文件到首字母文件夹并解决重名问题 [打印本页]
作者: qixiaobin0715 时间: 2020-12-31 09:19 标题: [已解决]批处理如何复制文件到首字母文件夹并解决重名问题
文件夹images下的子文件夹是以单个字母(A、B、C等)或单个数字(1、2、3等)或单个其它字符(#、_等)命名的,文件是以首字母分们别类的放在各子文件夹中的,比如big.jpg bad.jpg等是放在子文件B中的。
我平时零星收集的图片都放在D:\photos文件夹下,达到一定数量就统一更新一次图片,也就是将收集的图片分类复制到images的子文件夹中。
重名文件按以下规则处理:比如要复制big.jpg到B文件夹。如果文件夹中不存在big.jpg,直接复制过来;如果存在,复制过来时重命名为big (2).jpg(源文件不改名);如果存在big (2).jpg,重命名为big (3).jpg,依此类推。
作者: xczxczxcz 时间: 2020-12-31 14:06
好久没有写过了,
PS 3.0 以上,否则勿试。- function Rename-File {
- param([string]$dir, [string]$base, [string]$ext,
- [string]$bn = '', [uint16]$n = 0);
-
- if ([IO.File]::Exists("$dir\$($base+$bn+$ext)")) {
- $bn = ' (' + ++$n + ')';
- return Rename-File -dir $dir -base $base -bn $bn -ext $ext -n $n;
- }
- return $base + $bn;
- }
-
- ls 'D:\photos\*' -Include '*.jpg', '*.png' -file | % {
- $f_str = $_.BaseName.Substring(0, 1);
- $dir = "$pwd\images\$f_str";
- if (![IO.Directory]::Exists($dir)) { md $dir | Out-Null }
-
- $base = Rename-File -dir $dir -base $_.BaseName -ext $_.Extension;
- cp $_.FullName -dest "$dir\$($base+$_.Extension)" -Verbose;
- # cp 改为 move 则移动文件。
- }
- Pause
复制代码
作者: qixiaobin0715 时间: 2020-12-31 14:56
回复 2# xczxczxcz
谢谢,虽然ps版本太低用不了,先收下。
作者: WHY 时间: 2020-12-31 15:17
本帖最后由 WHY 于 2020-12-31 17:54 编辑
- @echo off
- set "srcDir=D:\photos"
- set "dstDir=D:\images"
- pushd "%srcDir%\"
-
- for %%i in (*.jpg *.bmp) do (
- set "name=%%~ni"
- setlocal enabledelayedexpansion
- set "fd=!dstDir!\!name:~0,1!"
- md "!fd!" 2>nul
- if not exist "!fd!\!name!%%~xi" (
- copy "!name!%%~xi" "!fd!\"
- ) else (
- set "n=1"
- call :Next "%%~xi"
- copy "!name!%%~xi" "!fd!\!name!(!n!)%%~xi"
- )
- endlocal
- )
- pause & exit
-
- :Next
- if exist "!fd!\!name!(!n!)%~1" (
- set /a n+=1
- goto :Next
- )
复制代码
作者: qixiaobin0715 时间: 2020-12-31 15:35
回复 4# WHY
太感谢了,非常好用。
作者: qixiaobin0715 时间: 2021-1-4 08:21
自己也写了一个。要复制的文件和批处理文件放到与单字符文件夹同一目录:- @echo off
- setlocal enabledelayedexpansion
- for %%a in (*.jpg) do (
- set x=%%a
- set x=!x:~0,1!
- if not exist "!x!\%%a" (copy "%%a" "!x!\") else (
- if not exist "!x!\%%~na (2).jpg" (copy "%%a" "!x!\%%~na (2).jpg") else (
- set n=2
- for /f "delims=" %%b in ('dir /b /a-d !x!\*^|findstr /r /be /c:"%%~na ([0-9][0-9]*).jpg"') do (
- set "str=%%~nb"
- set "m=!str:%%~na (=!"
- set "m=!m:)=!"
- if !m! gtr !n! set /a n=m
- )
- set /a n+=1
- copy "%%a" "!x!\%%~na (!n!).jpg"
- )
- )
- )
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |