【问题标题】:how do I loop through the results of this FIND command in my Linux shell script?如何在我的 Linux shell 脚本中循环遍历这个 FIND 命令的结果?
【发布时间】:2014-02-17 17:22:22
【问题描述】:

我编写了以下命令,按文件大小的顺序列出“~”内及以下的所有文件。它似乎工作正常:

find ~ -printf "%k KB %p\n" | sort -nr

现在我想把这是一个shell脚本并循环遍历结果以做更多的处理。

我用一个简单的 'ls' 命令让它工作:

dir="/home/myusername"
cmd='ls'
for i in `$cmd`
do
  echo $i
done

但这不起作用:

dir="/home/myusername"
cmd='find $dir -printf "%k KB %p\n" | sort -nr'
for i in `$cmd`
do
  echo $i
done

我也尝试在双引号前使用转义字符,但这也不起作用...

dir="/home/myusername"
cmd='find $dir -printf \"%k KB %p\n\" | sort -nr'
for i in `$cmd`
do
  echo $i
done

任何想法我做错了什么?

【问题讨论】:

  • @BroSlow 嗨——感谢您的帮助,但这是我的问题中的一个错字——我将“~”更改为“$dir”——谢谢
  • 没问题,另请参阅stackoverflow.com/a/11366230/3076724 以修复您的find 语法,否则它将在空格/奇怪字符上中断。
  • @thatotherguy 谢谢,但我不认为这是同一个问题。我只是想运行公认的棘手命令,而转义字符不起作用
  • @RobertHume 转义字符不起作用,因为您的方法存在根本缺陷。要遍历结果,请使用链接问题的方法(和sort -z 进行排序)。

标签: linux bash shell unix


【解决方案1】:

要执行简单的命令,您可以将find 的结果通过管道传输到xargs

find ~ -printf "%k KB %p\n" | sort -nr | xargs -l -i echo '{}'

-l:使xargs 一次处理一行。

-i:将每次出现的{} 替换为管道的输出。

【讨论】:

    【解决方案2】:

    用 BASH 中的 find 试试这个 while 循环:

    while read -r f; do
        echo "$f"
    done < <(find "$dir" -printf "%k KB %p\n" | sort -nr)
    

    【讨论】:

      【解决方案3】:

      这应该可行(请参阅https://stackoverflow.com/a/11366230/3076724 了解为什么不使用原始语法的解释)

      find "$dir" -printf "%k KB %p\n" | sort -nr |  while read -r i; do
        echo "$i"
      done
      

      【讨论】:

      • @RobertHume 你确定是作为 bash 脚本运行的?
      • 我想是的——我怎么能百分百确定?
      • @RobertHume 将ps -o cmd= -p $$ 放入脚本中。或者在你运行它之前从你的shell中echo $0 查看你正在使用的shell,或者只是运行它为bash whateverscript
      • while read语法的默认分隔符不是换行符吗?
      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多