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