使用 shell 脚本将文件夹中所有可执行文件的名称(带格式)写入文本文件?

使用 shell 脚本将文件夹中所有可执行文件的名称(带格式)写入文本文件?

我有大约 200 个 C 文件,需要将它们格式化为文本文件,如下所示:

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

创建文件后,二进制文件将./aarch64/le/.o和一起存储在.dep.

我需要创建一个在启动时使用的文本文件,以使用大约 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:t获取t路径的所有内容(其基本名称)。
  • $var:P获取路径的realP (其绝对、规范、符号链接自由路径,如标准函数或命令所做的那样)。athrealpath()realpath

对于 GNUfind和任何 shell(甚至是 bash,GNU shell):

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(或 bash,如果failglob设置了该选项)中,如果 中没有非隐藏文件aarch64/le/,您将收到错误)。

相关内容