【问题标题】:cat multiple files in separate directories file1 file2 file3....file100 using loop in bash script在 bash 脚本中使用循环在不同的目录中 cat 多个文件 file1 file2 file3 ....file100
【发布时间】:2020-05-04 12:21:22
【问题描述】:

我在多个目录中有多个文件,例如目录 1/file1 2/file2 3/file3......100/file100。我想在 bash 脚本中使用循环索引将所有这些文件分类到一个文件中。这样做有简单的循环吗?

谢谢,

【问题讨论】:

  • 所以你想要cat */file*
  • 这 100 个目录/文件遵循一些规则或者它们是完全随机的?例如。 dir{ID}/file{ID}?
  • 感谢您的 cmets。是的,所有文件都遵循 dir1/file1、dir2/file2、dir3/file3 .....dir100/file100。这就是为什么我想要在 bash 脚本中循环而不是执行 cat dir1/file1 dir2/file2 ... dir100/file100 > file
  • 啊,你想按数字顺序附加它们,而不是 1 10 2 20 3 ... 吗?最容易用前导零正确重命名它们001 等。否则只需for dir in 1 2 3 4 5 6 7 8 9 .... 100 ; do cat $dir/* ; done > outFile。祝你好运。

标签: bash loops cat


【解决方案1】:

这段代码应该可以解决问题;

for((i=1;i<=`ls -l | wc -l`;i++)); do cat dir${i}/file${i} >> output; done

【讨论】:

  • 我希望 cat 按顺序工作。我的意思是 cat 应该像“cat dir1/file1 dir2/file2 dir3/file3 > newfile”一样工作,以便在 newfile 中包含按 file1file2file3 顺序排列的文件 ....
  • @whoami 是 dir1、dir2、file1 和 file2 文件和目录的实际名称?
  • dir1, dir2分别为file1 file2所在的目录
  • 我刚刚尝试遵循您的一个建议,它看起来很有效。对于 ((i=1;i CARTKPT
【解决方案2】:

我举例说明了您所描述的目录结构和文件。使用它自己的内容创建目录和文件。

for ((i=1;i<=100;i++)); do 
  mkdir "$i" && touch "$i/file$i" && echo content of "$(pwd) $i" > "$i/file$i"
done

检查创建的目录。

ls */*

ls */* | sort -n

如果您看到创建了目录和文件,则继续下一步。

这个解决方案不涉及任何来自 shell 的外部命令,当然除了 cat :-)

现在我们可以使用 bash 语法检查每个文件的内容。

i=1
while [[ -e "$i" ]]; do
  cat "$i"/*
  ((i++))
done

此代码已在 dash 中测试。

i=1
while [ -e "$i" ]; do
  cat "$i"/*
  i=$((i+1))
done

完成后只需将输出的重定向添加到文件中即可。 如果您愿意,可以添加更多测试,请参阅 help test

还有一件事 :-),您可以使用 tail 和大括号 expansion 检查内容

tail -n +1 {1..100}/*

使用 cat 也可以重定向输出,只要记住 brace expansion 是 bash3+ 功能/语法。

cat {1..100}/*

【讨论】:

    【解决方案3】:
    seq 100 | sed 's:.*:dir&/file&:' | xargs cat
    
    • seq 100 生成从 1100 的数字列表
    • sed
      • s 替补
      • : 分隔部分命令
      • .*整行
      • : 分隔符。通常使用/,但在替换字符串中使用。
      • dir&amp;/file&amp;dir&lt;whole line&gt;/file&lt;whole line&gt;
      • :分隔符
      • 所以它生成dir1/file1的列表...dir100/file100
    • xargs - 将输入作为参数传递给...
      • cat - 所以它将执行cat dir1/file1 dir2/file2 ... dir100/file100

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-20
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多