我正在尝试查找具有名称的文件并使用 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
如果您不想在输出文件中列出长格式,则不要使用 ls 的
-l
选项。您真的需要该
deleted_files.txt
文件吗?如果没有,如果您创建它的唯一原因是为了可以迭代每个文件名,那么您可以运行find . -name 'core.*' -exec gdb /exec {} \;
.如果您还需要列表,那么可以使用类似以下内容之一:
# 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} 以及引用或不引用