将文件组移动到子目录中

时间:2014-10-03 01:12:12

标签: linux bash debian

我有30k +图像和许多文件夹来保存这些图像。我想要的是每个文件夹有100个图像。有谁知道Linux程序/脚本可以帮助我吗?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 "$@" "$newdir"  # or: qmv -t "$newdir" "$@"
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主要是findxargs的GNU扩展,但Mac OS X findxargs也支持他们。 -r的{​​{1}}选项也是GNU扩展名; Mac OS X xargs不支持它,它没有相应的功能。它也被称为xargs;这意味着如果没有列出文件名,则--no-run-if-empty不会运行程序xargs,这与标准movefiles.sh不同,标准xargs即使没有文件命令也至少运行一次命令。如果您没有-r,则可以使用if [ $# != 0 ]; then …current script…; fi修改脚本,以便在使用零参数调用时保护脚本。