2014-06-18 42 views
1

我在一个目录中有大约400万个扩展少的文件。通过bash将文件从一个目录分类并复制到另一个目录

我需要一个bash脚本将它们复制到另一个目录中,这样这些文件将被分类到每个目录1000个文件中。

例如, 源目录是/temp/hugenooffiles/

文件名是像m_100, m_1005, m_10005

目的地目录/temp/sortedfiles/

在目标目录,一个名为1目录应该从m_1通过m_999包含文件来创建。

directory 2应创建包含文件m_1000m_1999等。

目标文件应该被重命名为1_m, 1000_m

另外,如果在目标文件夹中的文件已经存在,那么他们应该被覆盖。

请帮忙。

+1

检查[这](http://stackoverflow.com/a/9085508/411882)答案... – plesiv

+1

你是问编写脚本的你,或者在你的方法的问题是什么?在后一种情况下,你忘记粘贴你的尝试。我想说“修复你的第4行,这是你的问题”,但没有参考源,我不能 –

+0

m_1到m_999也只是999个文件。 – konsolebox

回答

0
#!/bin/bash 

SOURCE='/temp/hugenooffiles' 
DEST='/temp/sortedfiles' 

I=0 
for FILE in "$SOURCE"/m_*; do 
    ((D = 1 + ++I/1000)) 
    [[ -d $DEST/$D ]] || mkdir -p "$DEST/$D" ## You can just skip dir checking but that would be slow. 
    cp -v "$FILE" "$DEST/$D/m_$I" 
done 

注意:默认情况下,Bash中的路径名扩展("$SOURCE"/m_*)是排序的。

+0

谢谢。还需要一个额外的更改。文件将被复制到的文件夹取决于“m_”后面出现的内容。例如。名为m_1至m_999的文件应进入名为1的文件夹,名为m_8677的文件将进入文件夹9,而m_9000将进入文件夹10。 – user3752017

0

我修改了konsolebox的脚本,它完成了这项工作。谢谢。

> #!/bin/bash 
> 
> SOURCE='/temp/hugenooffiles' 
> DEST='/temp/sortedfiles' 
> 
> I=0 
> for FILE in "$SOURCE"/m_*; 
> do 
>  ((D = ((${FILE#*_}/1000)) + 1)) 
>  [[ -d $DEST/$D ]] || mkdir -p "$DEST/$D" 
>  mv -v "$FILE" "$DEST/$D/${FILE#*_}_m" 
>  ((++I)) 
> done 
相关问题