Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 定期列出文件的Bash脚本_Linux_Bash_Shell_Loops_If Statement - Fatal编程技术网

Linux 定期列出文件的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

我有一个庞大的文件集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包含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的解释是非常有用的。我试图修改代码,使其从一个目录中提取文件,然后在另一个目录中创建新文件夹及其各自的文本文件,但无法完成。无论如何,这是一个很好的解决方案,这正是我所需要的。非常感谢。