Linux脚本-将当前文件夹下所有包含main函数的.c文件提取出来

实现一个Linux脚本,该脚本使用 for 循环遍历当前目录下的所有 .c 文件。
对于每个 .c 文件,使用 grep 命令来查找是否包含字符串 “main”。
如果该 .c 文件包含 “main”,则输出到/home/majn/llvm_project/extract_main目录下。

#!/bin/bash

# 目标目录
TARGET_DIR="/home/majn/llvm_project/extract_main"

# 创建目标目录,如果不存在的话
mkdir -p "$TARGET_DIR"

# 遍历当前目录下的所有 .c 文件
for file in *.c; do
    # 使用 grep 命令查找是否包含字符串 "main"
    if grep -q "main" "$file"; then
        # 如果找到,将该 .c 文件复制到目标目录下
        cp "$file" "$TARGET_DIR/"
        echo "Copied $file to $TARGET_DIR"
    else
        echo "$file does not contain 'main'"
    fi
done

这里做了以下几件事:

  1. 使用 mkdir -p 创建目标目录(如果不存在)。
  2. 使用 for 循环遍历当前目录下的所有 .c 文件。
  3. 使用 grep -q 查找每个文件中是否包含字符串 "main"
  4. 如果包含,使用 cp 命令将文件复制到目标目录。

注1:在shell脚本中,if语句的条件测试基于命令的退出状态(exit status)。在Unix和Linux中,退出状态0通常表示“成功”,而非0的退出状态通常表示“失败”。


grep -qfile.txt中找到匹配项时,它将返回0,这在if语句中被解释为“真”或“成功”。因此,控制流将进入then分支,并执行echo "Pattern found!"。反之,如果grep -q没有在file.txt中找到匹配项,它将返回一个非0的退出状态,这在if语句中被解释为“假”或“失败”。因此,控制流将进入else分支,并执行echo "Pattern not found!"


总结一下:在这个if语句中,如果grep -q找到匹配项(即成功),then分支将被执行;如果没有找到匹配项(即失败),else分支将被执行。这与grep -q命令返回的退出状态是一致的。

保存这个脚本,给它可执行权限,然后运行它:

chmod +x your_script.sh
./your_script.sh

注意:请确保你有写入 /home/majn/llvm_project/extract_main 目录的权限,并且在运行脚本之前要小心,以确保不会覆盖重要文件。如果需要,先在一个测试目录中运行这个脚本。

上述脚本执行报错!!!

./main.sh 
-bash: ./main.sh: /bin/bash^M: bad interpreter: No such file or directory

这个错误通常是因为脚本文件中含有 Windows 风格的换行符(\r\n),而 Linux 期望的是 UNIX 风格的换行符(\n)。当你在 Windows 系统中创建或编辑文本文件并将其转移到 Linux 系统时,这种情况可能会发生。

你可以使用 dos2unix 工具来转换文件的换行符。首先,你需要安装 dos2unix

sudo apt update
sudo apt install dos2unix  # 在基于 Debian 的系统中

或者

yum install dos2unix  # 在基于 RedHat 的系统中

然后,你可以运行下面的命令来转换脚本文件:

dos2unix main.sh

这会把 main.sh 中的所有 Windows 风格的换行符转换为 UNIX 风格的换行符。

然后,你应该能够正常运行脚本:

chmod +x main.sh
./main.sh

如果你没有 dos2unix 工具,也可以使用 sed 来进行转换:

sed -i 's/\r$//' main.sh

这行 sed 命令会查找并移除文件中所有行尾的 \r 字符。之后,你应该能够正常执行该脚本。


注2grep是一个常用的文本搜索工具,它可以搜索符合特定模式的行。-qgrep的一个选项,全称为--quiet--silent,用于使grep运行时不输出任何内容。换句话说,使用-q选项时,grep不会打印匹配的行。

尽管-q阻止了输出,但grep的退出状态仍然是基于搜索结果的。如果找到匹配项,grep将返回0(表示成功),如果没有找到匹配项,则返回非0值(表示失败)。

grep -q经常与shell脚本中的条件测试结合使用,因为通常在脚本中你可能只关心是否存在匹配项,而不关心具体的匹配内容。例如:

if grep -q "pattern" file.txt; then
    echo "Pattern found!"
else
    echo "Pattern not found!"
fi

在上面的示例中,脚本只检查file.txt中是否有匹配"pattern"的内容,而不显示实际的匹配行。如果找到匹配项,它会输出"Pattern found!“,否则输出"Pattern not found!”。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫客36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值