我想根据文件数(此处为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)
“()”内的数字表示文件数。
顺便说一句,我的代码的最后一步给出了此警告,如果有人可以解释正在发生的事情和解决方案,我将很高兴。
我发现发布的脚本有几个问题:
每个文件夹最多复制50个文件的逻辑过于复杂,并且整个循环的代码重复容易出错。
它使用重复使用的$@位置参数数组进行内部存储。此变量不是为此目的,最好使用新的专用数组。
与其将文件移动到子目录然后再复制回来,不如不进行移动,只需在第一步中将它们复制起来会更简单。
ls不建议解析的输出。
考虑下面这个更简单的逻辑:
初始化一个空数组to_copy,以保留应复制的文件 初始化文件夹计数器,用于计算目标文件夹 循环播放源文件 像以前一样应用过滤器(如果没有文件则跳过) 将文件添加到 to_copy 如果to_copy包含目标文件数,则: 创建目标文件夹 复制包含在其中的文件 to_copy 将的内容重置to_copy为空 增量 folder_counter 如果to_copy不为空 创建目标文件夹 复制包含在其中的文件 to_copy
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。