我正在尝试删除可由“.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”文件。我认为这不是正确比较文件名。 有人可以帮忙。
答案 0 :(得分:2)
比较bash中字符串的规范方法是:
if [ "$string1" == "$string2" ]; then
这样,如果其中一个字符串为空,它仍然会运行。
答案 1 :(得分:1)
你可以像这样使用它:
[[ "$cfile" = "$sfile" ]] && rm "$sfile"
OR
[[ "$cfile" == "$sfile" ]] && rm "$sfile"
或者使用旧的/bin/[
(测试)程序
[ "$cfile" = "$sfile" ] && rm "$sfile"
答案 2 :(得分:1)
说
if [ $chile==$sfile ]; then
总是是真的,因为它等于说
if [ something ]; then
始终确保运营商周围的空间。
另一个问题是你在说:
cfile=${cfile/%c/s}
你可能想说:
sfile=${cfile/%c/s}
你需要摆脱内循环:
for sfile in *.s; do
done
保留比较代码。
答案 3 :(得分:1)
我认为最简单的解决方案是:
for cfile in *.c ; do rm -f "${cfile%.c}.s" ; done
它只列出了所有.c
个文件,并尝试删除相应的.s
文件(如果有的话)。
答案 4 :(得分: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
但这当然会慢一些。