我有一个文件名列表,在一个名为file的变量中带有空格 我想遍历文件并获取文件名
files='a 1 .txt b 1 .txt c1.txt d 2 3 .txt'
IFS=$'\n'
for file in $files; do echo $file ; done;
我的预期输出是
a 1 .txt
b 1 .txt
c1.txt
d 2 3 .txt
我不确定如何将字符串分割开来吗?
答案 0 :(得分:1)
NB :这是一个真的坏主意。不要这样修复设置变量的代码。
您可以使用awk
来分割字符串,如下所示:
awk -F'.txt ?' '{for (i=1; i<NF; i++) printf "%s.txt\n", $i}' <<<$files |
while read filename; do
echo "doing something with \"$filename\""
done
这将在输出中产生:
doing something with "a 1 .txt"
doing something with "b 1 .txt"
doing something with "c1.txt"
doing something with "d 2 3 .txt"
但这是一个更好的主意:
如果要在变量中放入文件列表(可能包含空格),请不要这样做:
files=$(ls *.txt)
如您所见,您最终遇到的基本上是垃圾。使用find
和xargs
处理文件,如:
find . -name '*.txt' -print0 | xargs -0 ...
或循环遍历ls的输出:
while read filename; do
...do something with $filename here...
done < <(ls *.txt)
根据您要完成的工作,可能还有其他解决方案。
答案 1 :(得分:1)
您也可以使用Perl一线式实现。
> export files='a 1 .txt b 1 .txt c1.txt d 2 3 .txt'
> perl -ne 'BEGIN{@arr=split(".txt",$ENV{files});foreach(@arr){~s/(^\s*)|(\s+$)//g;print "$_.txt\n"} exit } '
a 1.txt
b 1.txt
c1.txt
d 2 3.txt
>