【问题标题】:how to compare output of two ls in linux如何在linux中比较两个ls的输出
【发布时间】:2012-11-29 09:01:33
【问题描述】:

所以这是我无法解决的任务。我有一个包含 .h 文件的目录和一个包含 .i 文件的目录,它们与 .h 文件同名。我只想通过键入命令来获得所有未找到的 .h 文件作为 .i 文件。这不是一个难题,我可以用某种编程语言来做,但我只是好奇它在 cmd 中的样子:)。更具体地说,这里是算法:

  • 从 ls *.h 获取不带扩展名的文件名
  • 从 ls *.i 获取不带扩展名的文件名
  • 比较它们
  • 打印 1 中未在 2 中遇到的所有名称

祝你好运!

【问题讨论】:

  • 请看一下linux中的sed程序。

标签: linux unix sed awk


【解决方案1】:
diff \
  <(ls dir.with.h | sed 's/\.h$//') \
  <(ls dir.with.i | sed 's/\.i$//') \
| grep '$<' \
| cut -c3-

diff &lt;(ls dir.with.h | sed 's/\.h$//') &lt;(ls dir.with.i | sed 's/\.i$//') 对两个目录执行ls,切断扩展名,比较两个列表。然后grep '$&lt;' 查找仅在第一个列表中的文件,cut -c3- 截断diff 插入的"&lt; " 字符。

【讨论】:

  • 感谢您的超级快速响应。我测试了,结果是: ls: dir.with.i: No such file or directory ls: dir.with.h: No such file or directory
  • 我通过对你的提议做了一点修改来解决它: comm -23
【解决方案2】:
ls ./dir_h/*.h | sed -r -n  's:.*dir_h/([^.]*).h$:dir_i/\1.i:p' | xargs ls 2>&1 | \
grep "No such file or directory" | awk '{print $4}' | sed -n -r 's:dir_i/([^:]*).*:dir_h/\1:p'

【讨论】:

  • 我的测试结果是:这样这样这样但应该是:hotfloorplan热点热点-iface npe这样
【解决方案3】:
ls -1 dir1/*.hh dir2/*.ii | awk -F"/" '{print $NF}' |awk -F"." '{a[$1]++;b[$0]}END{for(i in a)if(a[i]==1 && b[i".hh"]) print i}'

解释:

ls -1 dir1/*.hh dir2/*.ii

上面将列出两个目录中的所有文件 *.hh 和 *.ii 文件。

awk -F"/" '{print $NF}'

上面将只打印文件名,不包括文件的完整路径。

awk -F"." '{a[$1]++;b[$0]}END{for(i in a)if(a[i]==1 && b[i".hh"]) print i}'

上面将创建两个关联数组,一个包含文件名,一个不包含扩展名。 如果 hh 和 ii 文件都存在,则关联数组中的值将为 2 如果只有一个文件,则该值将为 1。所以我们需要值为 1 的数组项,它应该是一个头文件 (.hh)。 这可以使用在 END 块中完成的 asso..array b 来检查。

【讨论】:

  • 抱歉,它不起作用。结果是: ls: dir1/*.hh: 没有这样的文件或目录 ls: dir2/*.ii: 没有这样的文件或目录。无论如何,这是一个封闭的问题。感谢您的回复:)
【解决方案4】:

假设 bash 是你的 shell:

for file in $( ls dir_with_h/*.h ); do
    name=${file%\.h};         # trim trailing ".h" file extension
    name=${name#dir_with_h/}; # trim leading folder name
    if [ ! -e dir_with_i/${name}.i ]; then
        echo ${name};
    fi
done

毫无疑问,这几乎可以移植到所有其他 shell。我发现这比其他一些方法不那么神秘(尽管这肯定是我的问题),但它有点 罗嗦。像这样。一个 shell 脚本可能有助于回忆它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多