我有一个名为 的目录data
。里面data
有一个目录samples
,该目录包含 50 多个目录,testing.sh
里面有一个 shell 脚本data
。设置如下所示:
data
|___ samples
|______ PREC001
|______ PREC003
|______ PREC023
|______ KRES118
|______ TWED054
.
.
.
|______ PREC098
|___ testing.sh
我想创建一个文件,其中包含所有目录的.txt
路径以及目录名称。我正在Linux上工作。testing.sh
samples
创建的.txt
文件应如下所示:
/data/testing.sh PREC001 samples
/data/testing.sh PREC003 samples
/data/testing.sh PREC023 samples
/data/testing.sh KRES118 samples
/data/testing.sh TWED054 samples
.
.
.
/data/testing.sh PREC098 samples
如何在 Linux 中做到这一点。我实际上尝试了一些基本命令,但无法得到我想要的。谢谢。
答案1
这应该只是一个问题:
(cd data/samples && printf '/data/testing.sh %s sample\n' *) > file.txt
或者限制为文件类型目录只有zsh
:
printf '/data/testing.sh %s sample\n' data/samples/*(/:t) > file.txt
file.txt
请注意,它还具有报告错误并且在找不到匹配文件时不会破坏的优点。
(/:t)
用。。。来代替(-/:t)
还包括类型的文件符号链接最终解析为类型的文件目录。
如果这是为了生成稍后解释的 shell 代码sh
,您还需要确保正确引用文件名。您可以将其替换%s
为%q
,但是您需要确保脚本被解释为 ,zsh
而不是sh
as%q
可以使用特定于 的某种形式的引用zsh
。
另一种选择是使用qq
始终使用的参数扩展标志用于引用的单引号是最便携和最安全的引用运算符:
() {
printf '/data/testing.sh %s sample\n' ${(qq)@}
} data/samples/*(/:t) > file.txt
答案2
如果我理解正确的话,你可以这样做:
cd /pathto/data/samples || exit
for d in */; do
echo "/data/testing.sh ${d: 1:-1} samples" >> /pathto/file.txt
done
$ cat file.txt
/data/testing.sh REC001 samples
/data/testing.sh REC003 samples
/data/testing.sh REC023 samples
...