将包含数字的文件分组并划分到saperate文件夹中

2024-07-04 08:00:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把30个文件按顺序从图像1,图像2开始移动。。。从当前文件夹到新文件夹

文件名模式如下所示

image_1.png
image_2.png
.
.
.
image_XXX.png

I want to move image_[1-30].png to folder fold30
and image[31-60].png to fold60 and so on 

我有以下代码来做这件事,它的作品想知道有没有任何捷径来做到这一点

或者有没有更小的代码,我可以写同样的

#!/bin/bash
counter=0
folvalue=30
totalFiles=$(ls -1 image_*.png | sort -V | wc -l)
foldernames=fold$folvalue
for file in $(ls -1 image_*.png | sort -V )
do
((counter++))
mkdir -p $foldernames
mv $file ./$foldernames/    
if [[ "$counter" -eq "$folvalue" ]];
then
  let folvalue=folvalue+30
  foldernames="fold${folvalue}"
  echo $foldernames
fi
done

上面的代码在文件夹中移动图像1,图像2,…4..30

fold30

图像\u 31,…图像\u 60到文件夹

fold60


Tags: andto代码图像image文件夹pngcounter
2条回答

我真的建议每次都使用sedall。这对眼睛很难,但一旦你习惯了,你就可以马上完成所有这些烦人的任务。

它的作用很简单。运行sed -e "s/regex/substitution/" <(cat file)遍历每一行,用substitution替换匹配模式regex
有了它,您只需将输入转换为命令,并通过管道将其传输到bash即可。
如果你想知道更多,有好的documentation here(但对眼睛来说也不容易)

不管怎样,代码是这样的:

while FILE_GROUP=$(find . -maxdepth 0 -name "image_*.png" | sort -V | head -30) && [ -n "$FILE_GROUP" ]
do
   $FOLDER="${YOUR_PREFIX}$(sed -e "s/^.*image_//" -e "s/\.png//" <(echo "$FILE_GROUP" | tail -1))"
   mkdir -p $FOLDER
   sed -e "s/\.\///" -e "s|.*|mv & $FOLDER|" <(echo "$FILE_GROUP") | bash
done

它应该这样做:
-while循环获取第一个30文件。
-从最后一个文件中取出编号并命名目录
-mkdir FOLDER
-遍历每一行并将$FILE转换成mv $FILE $FOLDER,然后执行这些行(管道到bash)

注意:用文件夹替换$YOUR_PREFIX

编辑:令人惊讶的是,代码没有开箱即用(谁会想到……),但我已经做了一些修复和测试,现在应该可以工作了

最简单的方法是使用rename,也就是Perl rename。它将:

  • 你可以运行任意复杂的代码来找出一个新的名字
  • 让你做一次试运行,告诉你什么都不做会怎么样
  • 如果有文件将被覆盖,将向您发出警告
  • 自动创建中间目录层次结构

所以你想要的命令是:

rename -n -p -e '(my $num = $_) =~ s/\D//g; $_ = ($num+29)-(($num-1)%30) . "/" . $_' *png

样本输出

'image_1.png' would be renamed to '30/image_1.png'
'image_10.png' would be renamed to '30/image_10.png'
'image_100.png' would be renamed to '120/image_100.png'
'image_101.png' would be renamed to '120/image_101.png'
'image_102.png' would be renamed to '120/image_102.png'
'image_103.png' would be renamed to '120/image_103.png'
'image_104.png' would be renamed to '120/image_104.png'
...
...

如果看起来正确,您可以再次运行它,而不必使用-n开关来真正执行它

相关问题 更多 >

    热门问题