如何在命令提示符(或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
答案 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)
即使文件名称中包含空格和其他特殊字符,也能正常工作。