将文件分组到文件夹中的终端脚本
Terminal script to group files into folders
我有一个文件目录。我想把它们一起分批放到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
谁能告诉我如何做到这一点?
谢谢!
这是一个使用参数列表的解决方案(POSIX shell 唯一可用的列表,无需使用 bash 等高级功能)。注意警告;足够多的文件将无法放入参数缓冲区。另请注意,Stack Overflow 错误地假设 $#
(参数列表的长度)开始注释,因此颜色有点偏离。
#!/bin/sh
num_folders=3 # default to 3 directories
if [ $# -gt 0 ]; then
num_folders=
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 "" "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 *
不能 运行,则此脚本也不能)。
设置:
mkdir /tmp/so
cd /tmp/so
touch {A..Z} # create 26 files
最简单的方法:
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 ?)
我有一个文件目录。我想把它们一起分批放到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
谁能告诉我如何做到这一点?
谢谢!
这是一个使用参数列表的解决方案(POSIX shell 唯一可用的列表,无需使用 bash 等高级功能)。注意警告;足够多的文件将无法放入参数缓冲区。另请注意,Stack Overflow 错误地假设 $#
(参数列表的长度)开始注释,因此颜色有点偏离。
#!/bin/sh
num_folders=3 # default to 3 directories
if [ $# -gt 0 ]; then
num_folders=
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 "" "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 *
不能 运行,则此脚本也不能)。
设置:
mkdir /tmp/so
cd /tmp/so
touch {A..Z} # create 26 files
最简单的方法:
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 ?)