根据X划分文件并放入单个文件夹

时间:2011-09-27 08:34:23

标签: bash shell command-prompt

如何在命令提示符(或bash中的shell脚本)中创建脚本,以根据数字(例如X)划分文件,并将其放入单个文件夹中。

示例:我有10个文件,数字X是4(我可以在脚本中设置它)。因此,系统将在运行脚本后创建3个文件夹(第一个文件夹包含4个文件,第二个文件夹包含4个文件,最后一个文件夹将包含剩余的2个文件)。

关于文件的划分。它可以是日期或文件名。

示例:假设上面的10个文件是a.txt,aa.txt,b.txt,cd.txt,ef.txt,g.txt,h.txt,iii.txt,j.txt和zzz.txt 。运行脚本后,它将创建3个文件夹,使第一个文件夹包含a.txt,aa.txt,b.txt,cd.txt,第二个文件夹包含ef.txt,g.txt,h.txt,iii .txt和最后一个文件夹将包含其余文件 - j.txt和zzz.txt

2 个答案:

答案 0 :(得分:4)

根据您的描述,awk one liner可以实现您的目标。

检查下面的示例,您可以使用X:

更改xargs -n参数中的“4”
kent$  l
total 0
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 01.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 02.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 03.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 04.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 05.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 06.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 07.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 08.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 09.txt
-rw-r--r-- 1 kent kent 0 2011-09-27 11:04 10.txt

kent$  ls|xargs -n4|awk ' {i++;system("mkdir dir"i);system("mv "$0" -t dir"i)}'


kent$  tree
.
|-- dir1
|   |-- 01.txt
|   |-- 02.txt
|   |-- 03.txt
|   `-- 04.txt
|-- dir2
|   |-- 05.txt
|   |-- 06.txt
|   |-- 07.txt
|   `-- 08.txt
`-- dir3
    |-- 09.txt
    `-- 10.txt

答案 1 :(得分:0)

#!/usr/bin/env bash

dir="${1-.}"
x="${2-4}"

let n=0
let sub=0
while IFS= read -r file ; do
    if [ $(bc <<< "$n % $x") -eq 0 ] ; then
            let sub+=1
            mkdir -p "subdir$sub"
            n=0
    fi

    mv "$file" "subdir$sub"
    let n+=1
done < <(find "$dir" -maxdepth 1 -type f)

即使文件名称中包含空格和其他特殊字符,也能正常工作。