使用bash find命令时在列表中分配文件

时间:2018-09-07 19:12:14

标签: bash file

我正在尝试查看是否可以将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";

3 个答案:

答案 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