【问题标题】:Bash Scripting: Trying to find files using ls wild-cardingBash 脚本:尝试使用 ls 通配符查找文件
【发布时间】:2012-10-14 22:48:54
【问题描述】:

这是我的问题:我必须解决用户可配置的各种文件名/位置(数据目录可能有子目录)。如果我可以在循环之前完全解析文件名,则以下脚本有效:

[提示] 更多 test.sh #! /usr/bin/env bash 新文件=实际文件名 对于`find -L ${FILE_PATH}/data -type d`中的目录;做 `ls -1 ${directory}/${newfile} 2>/dev/null` 中的文件名;做 如果 [[ -r ${文件名} ]];然后 echo "找到 ${filename}" 菲 完毕 完毕 [提示] ./test.sh [提示] 找到 ${SOME_PATH}/actual-filename

但是,如果 newfile 中有任何通配符,则内部循环将不会运行。即使它只返回一个文件。

我会将 find 与一些正则表达式一起使用,但要自动生成正确的表达式并替换某些东西会很棘手(例如 pgb.f0010{0930,1001}{00,06,12,18} 与一些与 2010 年 9 月 30 日和 10 月 1 日相关联的文件,第一个分组是由我的脚本为提供的日期计算的)。

pgb.f0010093000 pgb.f0010093006 pgb.f0010093012 pgb.f0010093018 pgb.f0010100100
pgb.f0010100106 pgb.f0010100112 pgb.f0010100118 

我正在运行 Fedora 15 64 位。

【问题讨论】:

  • 请注意,for varname in $(ls -1 fileglob 2>/dev/null) 只是编写for varname in fileglob 的一种稍微错误的方式。 (在你的情况下:for filename in $directory/$newfile。)
  • 有人曾经告诉我:你永远不应该尝试解析或迭代 ls:mywiki.wooledge.org/ParsingLs 的输出
  • 我试过不这样做,但是 find 没有与 pgb.f0010{0930,1001}{00,06,12,18} 之类的东西兼容的正则表达式参数ls.
  • 还检查了:fileglob 中的 varname 实际上并没有得到与模式匹配的文件。
  • 请列出一个正在匹配的文件名的实际示例,以阐明所询问的内容。

标签: bash loops scripting


【解决方案1】:
新文件="*" 查找 -L ${FILE_PATH}/data -name "${newfile}" \ |读取文件名时 做 如果 [[ -r ${文件名} ]];然后 echo "找到 ${filename}" 菲 完毕

-或-

新文件="*" find -L ${FILE_PATH}/data -name "${newfile}" -reading -exec echo "Found {}" \;

-或使用正则表达式-

新文件='.*/pgb.f0010(0930|1001)(00|06|12|18)' 文件路径=。 找到 -L ${FILE_PATH}/。 -regextype posix 扩展\ -regex "${newfile}" - 可读 -exec echo "Found {}" \;

【讨论】:

  • 是的,find 适用于 -name *,但 find 似乎无法处理我上面给出的示例:-name pgb.f0010{0930,1001}{00,06,12, 18}
  • 然后将 -name 替换为 -regex ?
  • 我想支持 glob 选项,以便新手 *nix 用户可以使用 ls 命令进行测试。
  • ls -1 pgb.f0010{0930,1001}{00,06,12,18} 的使用是新手?我在 linux 之前就使用了 *nix,并且在提出这个问题之前从未使用过这种表示法。并不是说我是一个典型的新手,但也许在这个用途中,因为我从这个问题中学到了一些东西。
  • 从长远来看,教新手正则表达式可能比教他们神秘的文件通配技能更有价值。
【解决方案2】:

根本问题是损坏的脚本中存在对 shell 扩展的依赖。使用评估:

#! /usr/bin/env bash 文件路径=“。” 新文件=pgb.f0010{0930,1001}{00,06,12,18} 对于`find -L ${FILE_PATH}/data -type d`中的目录;做 `eval ls -1 ${directory}/${newfile} 2>/dev/null` 中的文件名;做 如果 [[ -r ${文件名} ]];然后 echo "找到 ${filename}" 菲 完毕 完毕

【讨论】:

  • 谢谢。尝试在脚本中为 {0930, 1001} 之类的内容自动生成正则表达式比我想做的要多。
  • 也许吧。 glob "{0930,1001}" 的正则表达式似乎并不比 glob 本身更难计算。正则表达式是“(0930)|(1001)”。全局字符“?”翻译成“.”,“*”翻译成“.*”。
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
相关资源
最近更新 更多