【问题标题】:Capture the output of command line in a variable in Unix在 Unix 的变量中捕获命令行的输出
【发布时间】:2022-01-15 20:32:21
【问题描述】:

我想在变量中捕获下面命令的输出。

命令:

find . -iname 'FIL*'.TXT

输出是:

./FILE1.TXT

我想将 './FILE1.TXT' 捕获到 'A' 变量中。但是当我尝试时

A=`find . -iname 'FIL*'.TXT`

那么这个命令正在显示文件的数据。但我想要变量 A 中的 ./FILE1.TXT 值。

【问题讨论】:

  • 请改进您的问题的表述。文件名与文件内容不同(有些文件没有名称或有多个名称,因为文件是inodes
  • 不明显为什么反引号中的命令将文件中的数据复制到变量而不是文件名。通常最好对Command Substitution 使用$(...) 表示法,但不应该影响事情。您可以将-print 用作find 命令的一部分,但这并不重要。可能是您对报告文件名的代码处理不当;它应该只是 echo "$A"printf "%s\n" $A 或类似的东西。小心文件名中的空格(或更糟的是换行符)。

标签: linux bash unix


【解决方案1】:

文件没有任何价值,但有内容。使用以下内容显示该内容。

  find . -iname 'FIL*'.TXT -exec cat {} \;

如果你想要一个变量中的所有内容(所有此类文件的),那么

  A=$(find . -iname 'FIL*'.TXT -exec cat {} \;)

顺便说一句,你本可以使用

  find . -iname 'FIL*.TXT' -print0 | xargs -0 cat 

如果您想在变量中包含此类文件的名称,请尝试

  A=$(find . -iname 'FILE*.txt' -print)

顺便说一句,在一些最近的几个交互式 shell(zshbashversion 4 但不是早期版本)上写

  A=**/FILE*.txt

我的感觉是 ** 功能本身值得切换到更新的 shell,但这只是我的意见。

另外,不要忘记文件可能有多个名称或没有名称。了解inodes ...

【讨论】:

  • 但我想要文件名,因为文件名是动态的。 FIL 字后面可以不一样。
  • 以上命令显示文件内容。我不想看到文件内容。您能否提出不同的解决方案。
  • 嘿,最后一个不工作。 cat: */FILE.txt: 没有这样的文件或目录
  • 双星 **/一些 shell 中的扩展,例如 zshbash 第 4 版但不是第 3 版。您可以考虑使用 zsh
【解决方案2】:
# ls *.txt
test1.txt  test.txt
# find ./ -maxdepth 1 -iname "*.txt"
./test1.txt
./test.txt
# A=$(find ./ -maxdepth 1 -iname "*.txt")
# echo $A
./test1.txt ./test.txt

如果你愿意,你可以忽略-maxdepth 1。我不得不在这个例子中使用它。

或者使用单个文件:

# ls *.txt
test.txt
# find ./ -maxdepth 1 -iname "*.txt"
./test.txt
# A=$(find ./ -maxdepth 1 -iname "*.txt")
# echo $A
./test.txt

【讨论】:

    【解决方案3】:

    你试试?

    A="`find . -iname 'FIL*'.TXT`"
    

    A="`find . -iname 'FIL*'.TXT -print`"
    

    【讨论】:

      猜你喜欢
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多