Bash脚本定期列出文件

时间:2013-12-19 12:37:33

标签: linux bash shell loops if-statement

我有一大堆文件,64,000,我想创建一个使用

列出文件名的Bash脚本
ls -1 > file.txt

每4,000个文件,并将生成的file.txt存储在单独的文件夹中。因此,每4000个文件的名称都列在存储在文件夹中的文本文件中。结果是

folder01包含列出文件#0-#4000

的file.txt

folder02包含列出文件#4001-#8000

的file.txt

folder03包含列出文件#8001-#12000

的file.txt

folder16包含列出文件#60000-#64000

的file.txt

非常感谢您提前

4 个答案:

答案 0 :(得分:5)

你可以尝试

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语句对于第一行为真
  • system从awk
  • 中调用操作系统函数
  • print本身将当前行打印到标准输出,我们可以使用>>
  • 将输出重定向(并附加)到文件中
  • awk中所有未初始化的变量都将为零值,因此我们不需要在程序开头说j=0

答案 1 :(得分:2)

这会让你非常接近;

ls -1 | split -l 4000 -d - folder

运行lssplit的结果,使用数字后缀(-l 4000)从标准输入({{1})中断每4000行(-d) })并使用-开始命名文件。

folderfolder00,...

中的结果

答案 2 :(得分:0)

这是使用awk

的精确解决方案
ls -1 | awk '  
 (NR-1) % 4000 == 0 {            
    dir = sprintf("folder%02d", ++nr)
    system("mkdir -p " dir);            
 }                                      
 { print >> dir "/file.txt"} '

答案 3 :(得分:0)

上面已经有了一些很好的答案,但我还建议您查看watch命令。这将每n秒重新运行一次命令,因此您可以观察输出。