Linux 定期列出文件的Bash脚本
我有一个庞大的文件集64000,我想创建一个Bash脚本,它使用Linux 定期列出文件的Bash脚本,linux,bash,shell,loops,if-statement,Linux,Bash,Shell,Loops,If Statement,我有一个庞大的文件集64000,我想创建一个Bash脚本,它使用 ls -1 > file.txt 对于每4000个文件,将生成的file.txt存储在单独的文件夹中。因此,每4000个文件的名称都列在存储在文件夹中的文本文件中。结果是 folder01包含file.txt,其中列出了文件#0-#4000 folder02包含file.txt,其中列出了文件#4001-#8000 folder03包含file.txt,其中列出了文件#8001-#12000 folder16包含fi
ls -1 > file.txt
对于每4000个文件,将生成的file.txt存储在单独的文件夹中。因此,每4000个文件的名称都列在存储在文件夹中的文本文件中。结果是
folder01包含file.txt,其中列出了文件#0-#4000
folder02包含file.txt,其中列出了文件#4001-#8000
folder03包含file.txt,其中列出了文件#8001-#12000
folder16包含file.txt,其中列出了60000到64000个文件
提前非常感谢这会让你非常接近
ls-1 | split-l 4000-d-文件夹
使用数字后缀(-d
),从标准输入(-
)通过拆分(-l 4000
)运行ls
的结果,并使用文件夹开始命名文件
结果在folder00
,folder01
,…中,您可以尝试
ls -1 | awk '
{
if (! ((NR-1)%4000)) {
if (j) close(fnn)
fn=sprintf("folder%02d",++j)
system("mkdir "fn)
fnn=fn"/file.txt"
}
print >> fnn
}'
说明:
- NR是awk中的当前记录编号,即:当前行号
- NR从第一行的1开始,所以我们减去1,这样第一行的
if
语句为true
system
从awk中调用操作系统函数
print
本身将当前行打印为标准输出,我们可以使用>
- awk中所有未初始化的变量都有一个零值,因此我们不需要在程序开始时说
j=0
这里使用
awk
得到一个精确的解决方案:
ls -1 | awk '
(NR-1) % 4000 == 0 {
dir = sprintf("folder%02d", ++nr)
system("mkdir -p " dir);
}
{ print >> dir "/file.txt"} '
上面已经有了一些很好的答案,但我也建议您看看watch
命令。这将每隔n秒重新运行一个命令,因此您可以查看输出。很好,还可以对您的脚本进行一些解释。@fedorqui感谢您的评论,但我不想添加任何解释,除非OP要求。嗯,我喜欢认为答案不是针对OP,而是针对所有可能进入网站并看到它的人。因此,理解越多越好:更多的人可以学习。当然,这是我的意见。@fedorqui是的,每个人都有权发表自己的意见。就我个人而言,我从解释中学习,但我从尝试先了解自己中学习更多。@Håkon Hægland令人敬畏的解决方案人。我认为自己是Linux的N0B,所以我同意FEDOQUI的解释是非常有用的。我试图修改代码,使其从一个目录中提取文件,然后在另一个目录中创建新文件夹及其各自的文本文件,但无法完成。无论如何,这是一个很好的解决方案,这正是我所需要的。非常感谢。