2014-10-03 161 views
0

我有30k +图像和许多保存这些图像的文件夹。我想要的是每个文件夹有100个图像。有谁知道可以帮助我的Linux程序/脚本?将文件组移动到子目录

最好我希望程序/脚本能够创建目录(即图像001,图像002,图像003等),然后放置100个图像(不同的扩展名.gif .jpg .png .bmp .webm)在每个文件夹中。

+0

你打算如何将文件分区到文件夹?随机?按名字?按类型?通过目录输入顺序? – 2014-10-03 01:24:26

+0

随机所有我真正想要的是每个文件夹100个文件,所以它更容易管理。 – ilovepoker 2014-10-03 01:27:01

+0

每个文件夹100个随机文件听起来并不容易管理,因为你永远无法找到任何东西......没有某种外部索引机制。但如果这就是你真正想要'xargs'可能会有所帮助。 – 2014-10-03 01:42:02

回答

0

只需使用标准和更可控的命令为更好地组织文件:

cd <your_image_folder_pathname>  
mkdir img_jpg img_gif img_bmp img_tiff 

mv *.jpg img_jpg 
mv *.gif img_gif 
mv *.bmp img_bmp 
mv *.tiff img_tiff 

移动剩余的文件,以img_misc

mkdir img_misc 
find -type f | xargs -I {} mv {} img_misc 
0

如果你是在Linux上,GNU mv命令有一个方便的选择-t target-directory这对xargs有用,但在这里我们需要每100个文件创建一个不同的目标目录,所以我们不会使用-t

xargs命令可以将文件名分组为100个组。残留问题是确定目标的目录名称。为此,一个shell脚本是适当的:

#!/bin/bash 

mkdir -p images-000 
dirnum=$(ls -d images-[0-9][0-9][0-9] | sed -n '$s/images-//p') 
newdir="images-$(($dirnum + 1))" 
mv "[email protected]" "$newdir" # or: qmv -t "$newdir" "[email protected]" 
rm -fr images-000 

images-000目录中创建初始化的东西,但绝不是对任何文件的目标。这次解析ls是可以的,因为它列出的名称将不包含空格,换行符或其他尴尬的字符。 (一般情况下,大约解析的ls输出极为谨慎。)

随着该脚本调用move-files.sh,你现在可以运行类似:

find /source/place-1 /opt/photos/place-2 … -type f -print0 | 
xargs -0 -n 100 -r -- movefiles.sh 

注意-print0-0主要是GNU扩展findxargs,但Mac OS X findxargs也支持它们。 选项xargs也是一个GNU扩展;它不支持Mac OS X xargs,它没有等效。它也被称为--no-run-if-empty;这意味着如果没有列出文件名,则xargs不运行程序movefiles.sh,这与标准xargs不同,即使没有文件名也需要运行该命令至少一次。如果您没有-r,则可以使用if [ $# != 0 ]; then …current script…; fi修改脚本,以便在用零参数调用该脚本时对其进行保护。

相关问题