0

我目前正在 GNU/Linux 系统上编写一些 C++ 代码,我的源代码文件夹中充满了 .cpp 文件和 .h 文件。

一般来说,对于这段代码,每个.cpp文件都有一个对应的.h头文件,但不一定反之亦然。在下面的输出中--表明列出的头文件没有对应的 .cpp 文件

我想通过在我的 .bashrc / .zshrc 中定义一个额外的标志来编写一个 bash 脚本来执行此操作,以便文件列表以这种格式出现。假设我有 7 个文件,一些.cpp和一些.h

$ listscript
hello1.cpp hello1.h
hello2.cpp hello2.h
   --      hello3.h 
hello4.cpp hello4.h      
4

4 回答 4

1
#!/usr/bin/env bash
declare files=(*)
declare file= left= right= width=10
declare -A listed=()
for file in "${files[@]}"; do
    if [[ $file == *.h ]]; then
        continue
    elif (( ${#file} > width )); then
        width=${#file}
    fi
done
for file in "${files[@]}"; do
    if [[ ${listed[$file]} == 1 ]]; then
        continue
    elif [[ $file == *.cpp ]]; then
        left=$file right=${file%.cpp}.h
    elif [[ $file == *.h ]]; then
        left=${file%.h}.cpp right=$file
    else
        left=$file right=
    fi

    [[ $left ]]     && listed["$left"]=1
    [[ $right ]]    && listed["$right"]=1

    [[ -e $left ]]  || left='--'
    [[ -e $right ]] || right='--'

    printf "%-*s %s\n" "$width" "$left" "$right"
done
于 2012-09-01T18:07:08.420 回答
1

由于每个.h文件可能有也可能没有相应的.cpp文件,因此只需遍历所有.h文件。对于每一个,您可以检查相应的.cpp文件是否存在,如果不存在则使用“---”。

for fh in *.h; do
    fcpp=${fh/%.h/.cpp}
    [ -f "$fcpp" ] || fcpp="---"
    printf "%s\t%s\n" "$fcpp" "$fh"
done
于 2012-09-01T18:09:47.900 回答
0

怎么样(在bash):

for f in $(ls -1 *.{cpp,h} | sed -e 's/.cpp//;s/.h//' | sort -u)
do 
    [ -f "${f}.cpp" ] && printf "%s " "${f}.cpp" || printf " -- "
    [ -f "${f}.h" ] &&  printf "%s" "${f}.h" || printf " -- "; 
    printf "\n"
done
于 2012-09-01T17:35:47.357 回答
0

这是我在 bash 中的尝试:

#!/bin/bash

# run like this:
# ./file_lister DIRECTORY

for i in $1/*.h
do
        name=`basename $i .h`
        if [ -e $name.cpp ]
        then
          ls $name.*
        else
          echo "-- " `basename $i`
        fi
done
于 2012-09-01T17:49:32.950 回答