我正在尝试在一行中打印当前文件夹中所有 .txt 文件的名称。我正在使用以下脚本。但是,它没有打印文件名。
REF_SEQ=""
find . -name "*.txt" -maxdepth 1 -type f |
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ+="${name} "
done
echo "Full Sequence: ${REF_SEQ}"
我当前文件夹中有 3-4 个 .txt 文件 (A.txt、B.txt ...)。我期望输出如下
完整序列:A.txt B.txt ...
如果我只是使用find
命令而不将输出分配给变量RED_SEQ
,我确实会得到所需的输出。这表明 find 命令工作正常,但不知何故我无法将其分配给变量。我尝试了各种不同的赋值运算符,但仍然没有成功。
答案1
要更新中的变量bash
,必须使用以下语法:
VAR="some stuff$VAR"
但是,由于您使用管道,while
循环是在子 shell 中执行的,因此变量会丢失。
要纠正这个问题,必须使用以下语法:
while read f
do
done <<< $(input)
因此就你的情况而言:
REF_SEQ=""
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ="${REF_SEQ}${name} "
done <<< $(find . -name "*.txt" -maxdepth 1 -type f)
echo "Full Sequence: ${REF_SEQ}"
答案2
问题是,您在管道符号后面使用了 {}。这只在 find 的 -exec 选项中有效,但在管道符号后面无效。
您可以尝试以下操作:
REF_SEQ=$(find . -maxdepth 1 -name "*.txt" -type f -printf "%f " | xargs)
这应该会产生您想要的结果。printf 指令 %f 输出找到的文件的基本名称,xargs “转置”结果。
诚挚问候 Jürgen