刚刚看有个老哥说用git一次push10万个文件报错了
稍稍思索了一下,文件多的时候可以分批操作
自己尝试了一下,确实是可以的
过程
首先创建了一个名为test的项目
git init test cd test
接着创建数量比较多的文件,我就创建1000个稍微意思一下就行了
for ((i=0;i<1000;i++)) do touch test$i.txt done
为了模拟比较真实的情况,也创建一些目录并在创建的目录里创建少量的文件
for ((i=0;i<10;i++)) do mkdir testdir$i for ((ii=0;ii<30;ii++)) do touch testdir$i/test$ii.txt done done
扩展
这里说一下ls
命令还有head
命令
ls功能就是列出当前目录下的文件和目录
head功能是显示文件的开头的内容
使用ls+grep命令只列出文件
ls
命令是展示当前目录下的目录和文件
此时我的需求是只想列出文件
可以看到目录和文件的区别就是目录后有一个 /
那么只要把带 /
的排除,那就是只列出文件了
ls | grep -v /
head命令列出指定数量的文件
列出目录下全部文件的命令是
ls | grep -v /
我们想要在这之中选择前100个文件
ls | grep -v / | head -n 100
Git
假设我要将这100个文件进行git push
的操作
那么我可以这样写
git add $(ls | grep -v / | head -n 100) git commit -m "push 100 个文件" git push origin master
Linux
假设我是在Linux下想要对这100个文件进行复制或者移动的操作
那么我可以这样写
# 复制 cp $(ls | grep -v / | head -n 100) ~/testdir/ # 移动 mv $(ls | grep -v / | head -n 100) ~/testdir/
进行下一批文件操作
前面我已经操作过100个文件了
现在需要操作第二批100个文件
Git
假设我要将第二批100个文件进行git push
的操作
那么我可以这样写
git add $(ls | grep -v / | head -n 200) git commit -m "push第二批 100 个文件" git push origin master
使用git add
当前目录下前200个文件,git add
会自动排除没有改动的文件,理所当然操作的就是第二批100个文件了
Linux
假设我要将第二批100个文件进行复制或者移动的操作
那么我可以这样写
# 复制 cp -n $(ls | grep -v / | head -n 200) ~/testdir/ # 移动 mv -n $(ls | grep -v / | head -n 200) ~/testdir/
使用cp -n
和mv -n
表示跳过同名文件,理所当然操作的就是第二批100个文件了
使用tail排除已经操作过的文件
假如我是一个强迫症
我不想在使用cp
和mv
命令的时候加-n
参数
我只想直接操作第二批第101~200的文件
我本来的想法是:对前200个文件使用grep
排除一次前100个文件的操作
但是grep是对字符串的操作,假如有多个雷同文件名的文件那么可能会出错
比如有0202.txt、20200202.txt两个文件
排除0202.txt时会把20200202.txt也意外排除掉
所以这里再来说一下head
的好兄弟tail
这兄弟俩功能和用法都相似,不过一个是头,一个是尾
就是字面意思,head是显示前面的内容,tail是显示后面的内容
那么我可以这样写
Git
git add $(ls | grep -v / | head -n 200 | tail -n 100) git commit -m "push第二批 100 个文件" git push origin master
Linux
# 复制 cp $(ls | grep -v / | head -n 200 | tail -n 100) ~/testdir/ # 移动 mv $(ls | grep -v / | head -n 200 | tail -n 100) ~/testdir/
第三批第四批第五批
head -n 200 | tail -n 100
实际就是列出前200中的后100个文件
那么要第三个100,第四个100,第五个100就是以此类推
#第三个100 head -n 300 | tail -n 100 #第四个100 head -n 400 | tail -n 100 #第五个100 head -n 500 | tail -n 100
后言
不知道还有什么说的,以后想到再说