我想遍历一个文件列表。这个列表是一个find命令的结果,所以我想出了:
getlist() {
for f in $(find . -iname "foo*")
do
echo "File found: $f"
# do something useful
done
}
这很好,除非文件名称中有空格:
$ ls
foo_bar_baz.txt
foo bar baz.txt
$ getlist
File found: foo_bar_baz.txt
File found: foo
File found: bar
File found: baz.txt
我能做些什么来避免空格分割?
我真的很喜欢for循环和数组迭代,所以我想我会把这个答案添加到混合…
我也喜欢marchelbling愚蠢的文件示例。:)
$ mkdir test
$ cd test
$ touch "stupid file1"
$ touch "stupid file2"
$ touch "stupid file 3"
在test目录中:
readarray -t arr <<< "`ls -A1`"
这将每个文件列表行添加到名为arr的bash数组中,并删除任何尾随换行符。
假设我们想给这些文件取一个更好的名字……
for i in ${!arr[@]}
do
newname=`echo "${arr[$i]}" | sed 's/stupid/smarter/; s/ */_/g'`;
mv "${arr[$i]}" "$newname"
done
$ {!arr[@]}扩展到0 1 2,因此"${arr[$i]}"是数组的第i个元素。变量周围的引号对于保留空格很重要。
结果是三个重命名的文件:
$ ls -1
smarter_file1
smarter_file2
smarter_file_3