批处理数组的索引顺序不正确
Indices of batch array not in the good order
我有 4 个文件 :
text1005.txt
text1007.txt
text1009.txt
text1012.txt
我创建列表:
FILES=$(find -type f -name "*txt")
arr=${FILES}
但是当我想打印索引时,它没有给出好的文件。例如,
echo ${arr[1]}
./text1009.txt
它应该给了我列表中的第一个文件 text1005.txt
。这将是有问题的,因为稍后,我将使用 $SLURM_ARRAY_TASK_ID
变量,所以我需要索引与好的文件匹配。
有什么建议吗?
首先,避免全大写变量。
二、
files=$(find -type f -name "*txt")
创建单个变量,而不是数组 -
$: echo "$files"
./text1005.txt
./text1007.txt
./text1009.txt
./text1012.txt
$: echo "${#files[@]}"
1
要插入数组,您需要括号。
files=( $(find -type f -name "*txt") )
第三,find
不会隐式对其输出进行排序。
如果您需要明确排序的输出,请明确排序您的输出。 :)
files=( $(find -type f -name "*txt" | sort ) ) # sort has lots of options
如果只是对文件进行词法排序,这似乎有点矫枉过正,这是简单通配的默认输出。在您的 find
中,您明确地将文件限制为 -type f
,这很好,但是由于您示例中的所有文件都是 *.txt
(我认为这是文本文件),因此可能没有必要。让解释器处理它而不用启动三个(是的,三个)子进程。
$: files=( *txt ) # faster & easier to read
$: echo "${files[@]}"
text1005.txt text1007.txt text1009.txt text1012.txt
$: echo "${#files[@]}"
4
$: echo "${files[0]}"
text1005.txt
$: echo "${files[2]}"
text1009.txt
这是你想要的吗?
我有 4 个文件 :
text1005.txt
text1007.txt
text1009.txt
text1012.txt
我创建列表:
FILES=$(find -type f -name "*txt")
arr=${FILES}
但是当我想打印索引时,它没有给出好的文件。例如,
echo ${arr[1]}
./text1009.txt
它应该给了我列表中的第一个文件 text1005.txt
。这将是有问题的,因为稍后,我将使用 $SLURM_ARRAY_TASK_ID
变量,所以我需要索引与好的文件匹配。
有什么建议吗?
首先,避免全大写变量。
二、
files=$(find -type f -name "*txt")
创建单个变量,而不是数组 -
$: echo "$files"
./text1005.txt
./text1007.txt
./text1009.txt
./text1012.txt
$: echo "${#files[@]}"
1
要插入数组,您需要括号。
files=( $(find -type f -name "*txt") )
第三,find
不会隐式对其输出进行排序。
如果您需要明确排序的输出,请明确排序您的输出。 :)
files=( $(find -type f -name "*txt" | sort ) ) # sort has lots of options
如果只是对文件进行词法排序,这似乎有点矫枉过正,这是简单通配的默认输出。在您的 find
中,您明确地将文件限制为 -type f
,这很好,但是由于您示例中的所有文件都是 *.txt
(我认为这是文本文件),因此可能没有必要。让解释器处理它而不用启动三个(是的,三个)子进程。
$: files=( *txt ) # faster & easier to read
$: echo "${files[@]}"
text1005.txt text1007.txt text1009.txt text1012.txt
$: echo "${#files[@]}"
4
$: echo "${files[0]}"
text1005.txt
$: echo "${files[2]}"
text1009.txt
这是你想要的吗?