在 bash 脚本中迭代文件并为每个文件执行 gdb 命令

在 bash 脚本中迭代文件并为每个文件执行 gdb 命令

我正在尝试查找具有名称的文件并使用 bash 脚本将其复制到一个文本文件中

我需要做的是我想向其中添加一个命令,以便它迭代这些文件并为每个文件执行 gdb 命令并将这些 gdb 详细信息打印到之前创建的同一文件中

我正在做的是

#!bin/bash

fpath=/home/filepath

find $fpath -name "core.*" -exec ls -larh {} \; > $fpath/deleted_files.txt
while read line; do gdb ./exec $line done; < $fpath/deleted_files.txt

它应该读取如下所示的唯一文件名

gdb ./exec core.123

但它读取如下文件并给出错误

gdb ./exec -rw-rw-r-- 1 home home 0 2022-12-06 13:59 /home/filepath/core.123
gdb : unrecognised option '-rw-rw-r--'

我怎样才能只给该命令提供文件名并将其粘贴到txt文件中。

答案1

  1. 如果您不想在输出文件中列出长格式,则不要使用 ls 的-l选项。

  2. 您真的需要该deleted_files.txt文件吗?如果没有,如果您创建它的唯一原因是为了可以迭代每个文件名,那么您可以运行find . -name 'core.*' -exec gdb /exec {} \;.

  3. 如果您还需要列表,那么可以使用类似以下内容之一:

# first make sure $fpath will be inherited by
# child processes (find and bash -c)
export fpath

find . -name 'core.*' -exec bash -c '
    for corefile; do
      printf "%s\n" "$corefile" >> "$fpath/deleted_files.txt"
      gdb /exec "$corefile"
    done
   ' bash {} +

或者只运行find两次:

find . -name 'core.*' > "$fpath/deleted_files.txt"
find . -name 'core.*' -exec gdb /exec {} \;

或者使用数组,这样您只需运行 find 一次:

# read find's output into array corefiles with mapfile.  use NUL as
# the filename separator.
mapfile -d '' -t corefiles < <(find . -name 'core.*' -print0)

# output the array to $fpath/deleted_files.txt, with a newline
# between each filename.
printf '%s\n' "${corefiles[@]}" > "$fpath/deleted_files.txt"

# iterate over the array and run gbd on each corefile.
for cf in "${corefiles[@]}" ; do
  gdb /exec "$cf"
done

顺便说一句,记得引用你的变量。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?$VAR 与 ${VAR} 以及引用或不引用

相关内容