如何在linux中比较两个ls的输出

时间:2012-11-29 09:01:34

标签: linux unix sed awk

所以这是我无法解决的任务。我有一个带.h文件的目录和一个带有.i文件的目录,它们与.h文件的名称相同。我只想输入一个命令,将所有.h文件找不到.i文件。这不是一个难题,我可以用某种编程语言来做,但我只是好奇它在cmd :)中会是什么样子。更具体的是算法:

  • 从ls * .h
  • 获取没有扩展名的文件名
  • 从ls * .i
  • 获取没有扩展名的文件名
  • 比较他们
  • 打印1中未满足的所有名称
祝你好运!

4 个答案:

答案 0 :(得分:5)

diff \
  <(ls dir.with.h | sed 's/\.h$//') \
  <(ls dir.with.i | sed 's/\.i$//') \
| grep '$<' \
| cut -c3-

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

答案 1 :(得分:0)

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'

答案 2 :(得分:0)

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文件都存在,则assosciative数组中的值将为2,如果只有一个文件,那么该值将为1.so我们需要值为1的数组项,它应该是头文件(.hh)。 这可以使用在END块中完成的asso..array b来检查。

答案 3 :(得分:0)

假设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脚本可能有助于回忆它。