开发者社区> 问答> 正文

如何根据文件数将一个文件夹的内容复制到多个文件夹?

我想根据文件数(此处为50)将文件从一个文件夹(名为1)复制到多个文件夹。

下面给出的代码有效。我根据文件数将所有文件从文件夹传输到子文件夹,然后将目录中的所有文件复制回初始文件夹。但是,我需要更清洁,更高效的工具。对于下面的混乱,我很抱歉。

bf=1 #breakfolder
cd 1 #the folder from where I wanna copy stuff, contains 179 files

flies_exist=$(ls -1q * | wc -l) #assign the number of files in folder 1

#move 50 files from 1 to various subfolders

while [ $flies_exist -gt 50 ]
do

mkdir ../CompiledPdfOutput/temp/1-$bf
set --
for f in .* *; do
  [ "$#" -lt 50 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done

mv -- "$@" ../CompiledPdfOutput/temp/1-$bf/
flies_exist=$(ls -1q * | wc -l)
bf=$(($bf + 1))
done

#mover the rest of the files into one final subdir

mkdir ../CompiledPdfOutput/temp/1-$bf
set --
for f in .* *; do
  [ "$#" -lt 50 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" ../CompiledPdfOutput/temp/1-$bf/
#get out of 1
cd ..

# copy back the contents from subdir to 1
find CompiledPdfOutput/temp/ -exec cp {} 1 \;

所需的目录结构为:

parent
  ________|________
  |               |
  1       CompiledPdfOutput
  |               |
(179)           temp
                  |
             ---------------
             |    |    |    |
            1-1  1-2  1-3  1-4
            (50) (50) (50) (29)

“()”内的数字表示文件数。

顺便说一句,我的代码的最后一步给出了此警告,如果有人可以解释正在发生的事情和解决方案,我将很高兴。

展开
收起
祖安文状元 2020-01-07 14:19:56 1109 0
1 条回答
写回答
取消 提交回答
  • 我发现发布的脚本有几个问题:

    每个文件夹最多复制50个文件的逻辑过于复杂,并且整个循环的代码重复容易出错。

    它使用重复使用的$@位置参数数组进行内部存储。此变量不是为此目的,最好使用新的专用数组。

    与其将文件移动到子目录然后再​​复制回来,不如不进行移动,只需在第一步中将它们复制起来会更简单。

    ls不建议解析的输出。

    考虑下面这个更简单的逻辑:

    初始化一个空数组to_copy,以保留应复制的文件 初始化文件夹计数器,用于计算目标文件夹 循环播放源文件 像以前一样应用过滤器(如果没有文件则跳过) 将文件添加到 to_copy 如果to_copy包含目标文件数,则: 创建目标文件夹 复制包含在其中的文件 to_copy 将的内容重置to_copy为空 增量 folder_counter 如果to_copy不为空 创建目标文件夹 复制包含在其中的文件 to_copy

    2020-01-07 14:20:04
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载