批量复制到多个目录

批量复制到多个目录

我的目录中有大约 9000 个文件,我想按文件名顺序将它们转移到 100 个目录中的 90 个文件中,忽略任何剩余部分。在将多个文件从文件名 X 复制到文件名 Y?,迦勒写在一个评论:

如果对象只是对它们进行批处理,那么有一个更简单的方法!ls | xargs -iX -n20 cp X target_folder/将以 20 个为一组对文件运行 cp,直到全部完成。

因此,基于使用 xargs,我如何切换 target_folder 来创建新文件夹并循环执行命令 100 次?

答案1

在 中bash,尝试以下代码:

#!/bin/bash

c=0

for f; do
    if ! ((c % 100)); then
        folder=folder_$(printf "%03d\n" $c)
        mkdir -p $folder
    fi

    [[ -d "$f" ]] || mv "$f" "$folder"
    ((c++))
done

像这样运行脚本:

./script.bash *

答案2

该命令看起来与您想要执行的操作不太接近。xargs可以提供帮助,但使用起来很麻烦,除非您知道文件名不包含任何空格或引号字符。这是一个 shell 循环,它将文件分派到新创建的子目录中,每个目录 90 个。

set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
  slice="$slice \"\${$i}\""
  i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
  mkdir part$i
  eval "mv $slice part$i"
  shift 90
done
# 0 to 89 files remain in the current directory

答案3

parallel支持运行多个命令,其中\;{#}是序列号:

ls|parallel -n90 mkdir {#}\;mv {} {#}

或者,如果文件名不包含空格、引号或反斜杠:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)

相关内容