【发布时间】:2020-06-30 16:39:51
【问题描述】:
出于各种原因,我需要将一个大型 s3 存储桶移动到本地文件存储中,这些文件存储为 160,000 个带有子目录的目录。
由于文件夹太多,无法使用 gui FTP 界面之类的东西查看,我想将 160,000 个根目录移动到 320 个目录中,每个目录 500 个目录。
我是 bash 脚本的新手,我刚刚写了这篇文章,但我害怕我会搞砸整个事情并且不得不重做转移。我用 [[ "$i" -ge 3 ]];和一些带有子目录的目录,看起来它工作正常,但我很紧张。不想重新传输所有这些数据。
i=0;
j=0;
for file in *; do
if [[ -d "$file" && ! -L "$file" ]];
then
((i++))
echo "directory $file is being written to assets_$j";
mv $file ./assets_$j/;
if [[ "$i" -ge 499 ]];
then
((j++));
((i=0));
fi
fi;
done
感谢您的帮助!
【问题讨论】:
-
你的问题不是很清楚。你能举一个你想要的例子吗,比如说 10 个目录
-
也许
rsync有用。如果我是你,我会创建一个包含要移动的文件夹列表的文件,然后我会遍历该文件并在另一个文件中记录已完成的工作。 -
你可以用 cp 代替 mv。然后,如果出现问题,您可以重新启动它。在这种情况下, cp 应该不会慢很多(除了你可能想要 rm * 当你有一个好的本地副本时)
-
您可能应该在循环顶部添加一个
[[ $file = assets_* ]] && continue,这样您就不会尝试重命名已经存在的assets_*目录。 -
顺便说一句,
if (( i >= 499 ))是比较i和499的更好的 bashism。如果您要使用不符合 POSIX 的语法,不妨选择更具可读性、内置目的的语法。 :)