将文件分组到文件夹中的终端脚本

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

最简单的方法:

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 ?)