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

时间:2015-01-09 16:22:20

标签: shell unix

我有一个文件目录。我想将它们分批分组到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

任何人都可以告诉我如何做到这一点?

谢谢!

2 个答案:

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