0

我正在尝试删除可以由“.c”源文件派生的文件夹中的所有“.s”文件。这是我的代码

for cfile in *.c; do 
    #replace the last letter with s
    cfile=${cfile/%c/s}
    for sfile in *.s; do
        #compare cfile with sfile; if exists delete sfile
        if [ $cfile==$sfile ]; then
            rm $sfile;
        fi
    done
done

但是这段代码删除了所有的“.s”文件。我认为它没有正确比较文件名。有人可以帮忙吗。

4

5 回答 5

2

在 bash 中比较字符串的规范方法是:

if [ "$string1" == "$string2" ]; then

这样,如果其中一个字符串为空,它仍然会运行。

于 2013-10-04T12:03:49.707 回答
1

我认为最简单的解决方案是:

for cfile in *.c ; do rm -f "${cfile%.c}.s" ; done

它只是列出所有.c文件并尝试删除相应的.s文件(如果有)。

于 2013-10-04T12:23:34.727 回答
1

你可以像这样使用它:

[[ "$cfile" = "$sfile" ]] && rm "$sfile"

或者

[[ "$cfile" == "$sfile" ]] && rm "$sfile"

或使用旧/bin/[(测试)程序

[ "$cfile" = "$sfile" ] && rm "$sfile"
于 2013-10-04T12:08:12.187 回答
1

if [ $chile==$sfile ]; then

永远真的,因为它等于说

if [ something ]; then

始终确保操作员周围的空间。

另一个问题是你说:

cfile=${cfile/%c/s}

你可能想说:

sfile=${cfile/%c/s}

你需要摆脱内循环:

for sfile in *.s; do
done

只保留比较代码。

于 2013-10-04T12:08:41.743 回答
0
for cFile in *.c; do
    sFile="${cFile%c}s"
    if [[ -f "$sFile" ]]; then
        echo "delete $sFile"
    fi
done

我作为练习留下的文件的实际删除。:-)

您也可以暴力破解并删除所有内容并将错误消息重定向到/dev/null

for cFile in *.c; do
    sFile="${cFile%c}s"
    rm "$sFile" &> /dev/null
done

但这当然会慢一些。

于 2013-10-04T12:13:00.340 回答