我有大约 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*)
是全局限定符,N
ullglob ,如果没有匹配项,列表将扩展为空,*
以选择可执行文件(助记符:与可执行文件使用的前缀相同ls -F
)。$var:t
获取t
路径的所有内容(其基本名称)。$var:P
获取路径的real
P (其绝对、规范、符号链接自由路径,如标准函数或命令所做的那样)。ath
realpath()
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/
,您将收到错误)。