我有一个文件目录。我想将它们分批分组到n个目录中。
因此...
" MyFolder文件"有文件A,B,C,D,E,F,G,H,I,J
我想把它们放进去,比方说,3批次......像这样批量生产:
Folder 1 - A, B, C, D
Folder 2 - E, F, G
Folder 3 - H, I, J
(而不是这样......这只是我自己可以解决的问题)
Folder 1 - A, D, G, J
Folder 2 - B, E, H
Folder 3 - C, F, I
任何人都可以告诉我如何做到这一点?
谢谢!
答案 0 :(得分:2)
这是一个使用参数列表的解决方案(唯一可用于POSIX shell的列表,而不使用例如bash的高级功能)。请注意警告;足够多的文件将不适合参数缓冲区。另请注意,Stack Overflow错误地假定$#
(参数列表的长度)开始注释,因此着色有点偏。
#!/bin/sh
num_folders=3 # default to 3 directories
if [ $# -gt 0 ]; then
num_folders=$1
shift
fi
# put all files into "argument" list
# (CAVEAT: this won't work on a dir with a LOT of files)
set - *
batch=$(( $# / $num_folders )) # files per folder
remainder=$(( $# % $num_folders )) # folders to get an "extra" file
i=1
while [ $i -le $num_folders ]; do
mkdir "Folder $i"
if [ $i -le $remainder ]
then j=0
else j=1
fi
while [ $j -le $batch ]; do
mv "$1" "Folder $i"
shift
j=$(( $j + 1 ))
done
i=$(( $i + 1 ))
done
这个脚本正在运行中(我使用#
作为提示来触发命令与输出的不同颜色):
# touch A B C D E F G H I J
# ls *
A B C D E F G H I J
# sh ../batch-n.sh 3
# ls *
Folder 1:
A B C D
Folder 2:
E F G
Folder 3:
H I J
以下是当n = 4
# touch A B C D E F G H I J
# ls *
A B C D E F G H I J
# sh ../batch-n.sh 4
# ls *
Folder 1:
A B C
Folder 2:
D E F
Folder 3:
G H
Folder 4:
I J
我将此代码放在父目录中(因此我将其作为../batch-n.sh
调用),否则它将自行归档。对于包含空格的文件,这可以正常工作,只要它们都适合单个命令(如果ls *
无法运行,则此脚本也不能运行。)
答案 1 :(得分:2)
设定:
mkdir /tmp/so
cd /tmp/so
touch {A..Z} # create 26 files
最简单的方法:
<强> Live On Coliru 强>
for a in Folder\ {1..8}; do mkdir -pv "$a"; read z y x w; mv -v "$z" "$y" "$x" "$w" "$a/"; done < <(ls ? | xargs -n4)
或者,更漂亮:
for a in Folder\ {1..8};
do mkdir -pv "$a"
read z y x w
mv -v "$z" "$y" "$x" "$w" "$a/"
done < <(ls ? | xargs -n4)
或者,(稍微好一点的名称包含空格)
for a in Folder\ {1..8}; do mkdir -pv "$a"; read z && read y && read x && read w; mv -v "$z" "$y" "$x" "$w" "$a/"; done < <(ls ?)