【问题标题】:Please help me in this nested for loop unix请在这个嵌套的 for 循环 unix 中帮助我
【发布时间】:2014-09-18 15:38:09
【问题描述】:
for i in `ls -l`; do for j in `ls -l /abc`; do cat $j | grep $i;done;done;

我想用 abc 目录中的文件搜索 pwd 中的每个文件名。请帮帮我。

【问题讨论】:

  • 上面那个不行:(
  • 永远不要在 shell 中循环 ls 的输出,任何时候你编写一个 shell 循环只是为了解析文本,这是错误的方法,你不需要 cat 和 grep (UUOC),并且总是引用你的 shell 变量,除非你有一个特定的目的,要求它们不被引用并完全理解所有的含义。

标签: unix for-loop awk grep cat


【解决方案1】:

我猜你想要:

for filename in * ; do
    grep -F -- "$filename" /abc/*
done

请注意,由于grep 的性质,如果您的任何文件名包含换行符,这将无法正常工作。 (幸运的是,这种情况很少见;但要牢记这一点。)

【讨论】:

  • 谢谢。很好。我想使用两个 for 循环并将输出重定向到 pwd 中每个文件的文件
  • @user2433165 这个答案对我来说似乎是正确的。如果你想通过创建任意嵌套循环来过度复杂化你的生活,那就是自残或家庭作业。
【解决方案2】:

如果您的密码中的文件不能在其名称中包含换行符,那么这样的方法将是正确的方法:

ls |
awk '
NR==FNR{ files[$0]; next }
{
    for (file in files) {
        if ( index($0,file) ) {
            print FILENAME, file
        }
    }
}
' - /abc/*

但是,就像您的 grep 方法一样,它很容易出错,因为名为“the”的文件将匹配包含“then”的行,并且如果它在目标文件中多次出现,它会多次报告相同的匹配。如果其中有任何问题,请更新您的问题以显示一些示例输入和输出,以便我们为您提供帮助。

【讨论】:

    【解决方案3】:

    不是一个真正的编程问题.. 但是只使用 find 呢?

    find abc -type f -name $filename..

    即使上面的方法不能完全满足你的要求(我有点不清楚),如果你已经有一个方法可以做到这一点,那么使用嵌套的ls 是非常疯狂的。

    man find,如果您想了解有关 find 命令的更多信息。

    要对您找到的文件执行更多操作,您可以使用 -exec 标志为每个找到的文件执行某些操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2020-05-11
      • 2019-06-07
      • 2019-02-09
      • 2021-08-21
      • 1970-01-01
      相关资源
      最近更新 更多