我正在尝试查看是否可以将find
命令的输出分配给变量。在这种情况下,它将是一个列表,并且一次迭代一个文件以评估该文件。
我已经尝试过:
#!/bin/bash
PATH=/Users/mike/test
LIST='find $PATH -name *.txt'
for newfiles in @LIST; do
#checksize
echo $newfiles
done
我的输出是:
@LIST
我正在尝试执行与bash中perl中的glob命令相同的操作。
var = glob "PATH/*.txt";
答案 0 :(得分:3)
使用$(command)
执行command
并用其输出代替该构造。
list=$(find "$PATH" -name '*.txt')
要访问变量,请在名称前加上$
,而不要放在@
之前(您的perl
经验正在显示)。
for newfiles in $list; do
echo "$newfiles"
done
但是,像这样解析find
的输出是很危险的,因为如果任何文件名包含空格,都会得到不正确的结果,它将被视为多个名称。最好通过管道传递输出:
find "$PATH" -name '*.txt' | while read -r newfiles; do
echo "$newfiles"
done
此外,请注意,如果变量中包含空格,则您应将它们不希望被分成多个单词的变量加引号。
并避免使用全大写的变量名。通常,这是为环境变量保留的。
答案 1 :(得分:1)
LIST = $(找到$ PATH -name * .txt) 用于$ LIST中的新文件;做
请注意,如果任何文件的名称中都有空格,则会出现问题。
答案 2 :(得分:0)
假设您正在使用bash
4或更高版本,请不要在这里完全使用find
。
shopt -s globstar nullglob
list=( "$path"/**/*.txt )
for newfile in "${list[@]}"; do
echo "$newfile"
done