シェルスクリプトを使用して、フォルダ内のすべての実行可能ファイルの名前(形式を含む)をテキストファイルに書きますか?

シェルスクリプトを使用して、フォルダ内のすべての実行可能ファイルの名前(形式を含む)をテキストファイルに書きますか?

約200個のCファイルがあり、次のテキストファイルでフォーマットする必要があります。

sem_post_stress.c
dup_fdopendir.c
shm_open.c and 198 others...

ファイルが生成されると、バイナリ./aarch64/le/は 。.o.dep

起動時に、次の形式(バイナリごとに1行)で約200個のバイナリを含むイメージを作成するために使用されるテキストファイルを作成する必要があります。

/tmp/sem_post_stress = /home/.../.../.../.../aarch64/le/sem_post_stress

/tmp/dup_fdopendir = /home/.../.../.../.../aarch64/le/dup_fdopendir

/tmp/shm_open = /home/.../.../.../.../aarch64/le/shm_open

このリンクから:https://www.redhat.com/sysadmin/bash-scripting-loops

次のようにすべてのファイルの名前を変更する方法を知っていますが、私のqemu環境または残りの環境にプレフィックスを追加する方法はわかりませんfor i in $(ls *.); do"/tmp/"=absolute path

私は初めてbashに触れて、一度も試したことがないので、これがマイナーな場合は申し訳ありません。どこを見てみました。どんなヒントやコードでも本当にありがとうございます!

答え1

そしてzsh

(for file (aarch64/le/*(N*)) print -r /tmp/$file:t = $file:P) > file.out

どこ:

  • aarch64/le/*(N*)次に展開されるaarch64/le非表示で実行可能な汎用(N*)ファイルのリストグローバル予選Nullglob、一致するものがない場合は、実行可能ファイル*を選択するためにリストが空になります(ニーモニック:実行可能ファイルで使用されているものと同じプレフィックスls -F)。
  • $var:ttパスのすべての内容(デフォルト名)を取得します。
  • $var:PrealパスのPを取得します(標準関数やコマンドと同様に、絶対的で正式でシンボリックリンクのないパス)。athrealpath()realpath

GNUfindとすべてのシェル(bash、GNUシェルを含む)の場合:

LC_ALL=C find "$PWD/aarch64/le/" -maxdepth 1 ! -name '.*' -executable -type f \
  -printf '/tmp/%f = %p\n' > file.out

zshメソッドとは異なり、これはソートされていないリストを提供します。

sh標準とユーティリティを含むPOSIXly:

for file in aarch64/le/*; do
  if [ -x "$file" ] && [ -f "$file" ] && [ ! -L "$file" ]; then
    printf '%s\n' "/tmp/${file##*/} = $PWD/$file"
  fi
done > file.out

(zshとbashでも機能しますが、zsh(またはfailglobオプションが設定されている場合はbash)でaarch64/le/

関連情報