今天遇到了一个小问题:有一堆积累了一段时间的照片,都是JPG格式的,文件名也已经按这样的格式「XXXXXXXX_YYYYY.jpg」完成命名了,现在需要按下划线 前面的文字为文件夹名称,把下划线 前面的内容相同的照片批量保存到同一个文件夹里面去。
虽然用鼠标点选,然后复制、粘贴也不是太~(长音)麻烦,但是照片实在有点多,从密密麻麻、长长短短的文件名里,一个一个看清楚什么是名字,然后再找到要放入的文件夹, *** 作时间久了还是有点伤眼睛的。
比如像下面这张图的时候,
于是想到用shell script文件来做批量处理。经过小小的调试,顺利完工。感到小确幸之余,就想着干脆分享上来。一则作为笔记留底,以后再遇到这样的情况就直接拿来用,也懒得再想了;二则希望能为有相同需要的同学提供一点儿微小的帮助吧。
好的,闲话少叙,言归正传。下面就奉上shell script的具体内容吧!
为了避免在通过脚本文件执行「移动」文件命令时发生异常而导致源文件消失(连回收站里也没有)的情况,建议使用「复制」文件到同名文件夹的脚本文件来处理,等正确完成复制 *** 作之后,再手动统一删除不需要了的源文件。
以下是用类似的文件名来做演示的截图示意,文件名没有实际意义,仅供示意。
完成!
砚湖@飘香生活馆
二〇一八年十二月十九日
不清楚你的实际文件/情况,仅以问题中的样例说明及猜测为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI,跟要处理多个文件夹放一起双击运行<# :cls&echo off&cd /d "%~dp0"&mode con lines=5000
rem 根据文件夹名称开头相同的字符内容,将名称长度较长的文件夹对应放入名称长度较短的文件夹里
set #=Any questions&set _=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%_% %z%
set "current=%cd%"
powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
echo%#% +%$%%$%/%_% %z%
pause
exit
#>
$b=[Convert]::FromBase64String("IC0tPiA=")
$c=[Text.Encoding]::Default.GetString($b)
$current=$env:current
$dic1=New-Object 'System.Collections.Generic.Dictionary[string, string]'
$dic2=New-Object 'System.Collections.Generic.Dictionary[string, object]'
$folders=@(dir -literal $current|?{$_ -is [System.IO.DirectoryInfo]}|sort {$_.Name.length})
for($i=0$i -lt $folders.length$i++){
$base1=$folders[$i].Name
if(-not $dic1.ContainsKey($base1)){
for($j=0$j -lt $folders.length$j++){
$base2=$folders[$j].Name
if(-not $dic1.ContainsKey($base2)){
if(($base2.length -gt $base1.length) -and ($base2.toLower().Contains($base1.toLower()))){
if(-not $dic2.ContainsKey($base1)){
$arr=New-Object -TypeName System.Collections.ArrayList
$dic1.add($base1, '')
$dic2.add($base1, $arr)
}
if(-not $dic1.ContainsKey($base2)){$dic1.add($base2, '')}
[void]$dic2[$base1].add($base2)
}
}
}
}
}
foreach($key in $dic2.Keys){
for($i=0$i -lt $dic2[$key].Count$i++){
$dic2[$key][$i]+$c+$key
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)