名前のあるファイルを見つけて、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
出力ファイルに長い形式のリストが必要ない場合は、
-l
lsオプションを使用しないでください。このファイルは本当に必要ですか
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 {} +
または単に2回実行してください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
しかし、変数を引用することを忘れないでください。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?そして$VAR対${VAR}と引用