4

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

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

祝你好运!

4

4 回答 4

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

于 2012-11-29T09:09:50.020 回答
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'
于 2012-11-29T09:14:45.370 回答
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 文件都存在,则关联数组中的值将为 2 如果只有一个文件,则该值将为 1。所以我们需要值为 1 的数组项,它应该是一个头文件 (.hh)。这可以使用在 END 块中完成的 asso..array b 来检查。

于 2012-11-29T09:36:43.053 回答
0

假设 bash 是你的外壳:

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

于 2012-11-29T10:43:25.087 回答