如何将find $1
的结果放入数组?
for for循环:
for /f "delims=/" %%G in ('find $1') do %%G | cut -d\/ -f6-
答案 0 :(得分:56)
我想哭。
在bash中:
file_list=()
while IFS= read -d $'\0' -r file ; do
file_list=("${file_list[@]}" "$file")
done < <(find "$1" -print0)
echo "${file_list[@]}"
file_list
现在是一个包含find "$1
“第6场”有什么特别之处?目前尚不清楚您尝试使用cut
命令做什么。
你想在第6个目录之后剪切每个文件吗?
for file in "${file_list[@]}" ; do
echo "$file" | cut -d/ -f6-
done
但是为什么“第6场”呢?我可以假设您实际上只想返回路径的最后一个元素吗?
for file in "${file_list[@]}" ; do
echo "${file##*/}"
done
甚至
echo "${file_list[@]##*/}"
这将为您提供数组中每个路径的最后一个路径元素。你甚至可以用结果做点什么
for file in "${file_list[@]##*/}" ; do
echo "$file"
done
(一个人应该使用内置readarray
代替)
find "$1" -print0
查找内容并'在标准输出上打印完整文件名,后跟空字符'。这很重要,因为我们稍后会将该输出拆分为空字符。
<(find "$1" -print0)
“进程替换”:find
子进程的输出通过FIFO读入(即find
子进程的输出在这里的行为类似于文件)
while ...
done < <(find "$1" -print0)
find
子进程的输出由while
命令通过<
IFS= read -d $'\0' -r file
这是暂时的条件:
read
读取一行输入(来自find命令)。 read
的返回值为0,除非遇到EOF,此时退出。
-d $'\0'
...将空字符作为分隔符(请参阅bash手册页中的QUOTING)。这是因为我们之前使用-print0
使用了空字符。
-r
反斜杠不被视为转义字符,因为它可能是文件名的一部分
file
结果(实际上是第一个单词,这里是唯一的)放入变量file
IFS=
该命令与IFS
一起运行,read
是一个特殊变量,其中包含file_list=("${file_list[@]}" "$file")
将输入拆分为未设置的字符的字符。因为我们不想拆分。
在循环中:
$file
在循环内部,file_list数组只是由{{1}}增长,适当引用。
答案 1 :(得分:10)
arrayname=( $(find $1) )
我不明白你的循环问题?如果您看看如何使用该数组,那么在bash中,您可以遍历所有数组元素,如下所示:
for element in $(seq 0 $((${#arrayname[@]} - 1)))
do
echo "${arrayname[$element]}"
done
答案 2 :(得分:1)
这可能不是100%万无一失,但它可能在99%的时间内工作(我使用GNU实用程序; BSD实用程序无法在没有修改的情况下工作;另外,这是使用ext4文件系统完成的):< / p>
declare -a BASH_ARRAY_VARIABLE=$(find <path> <other options> -print0 | sed -e 's/\x0$//' | awk -F'\0' 'BEGIN { printf "("; } { for (i = 1; i <= NF; i++) { printf "%c"gensub(/"/, "\\\\\"", "g", $i)"%c ", 34, 34; } } END { printf ")"; }')
然后你会像这样迭代它:
for FIND_PATH in "${BASH_ARRAY_VARIABLE[@]}"; do echo "$FIND_PATH"; done
确保在使用路径时将$ FIND_PATH括在双引号内。
答案 3 :(得分:1)
这是一个更简单的无管版本,基于user2618594的版本
declare -a names=$(echo "("; find <path> <other options> -printf '"%p" '; echo ")")
for nm in "${names[@]}"
do
echo "$nm"
done
答案 4 :(得分:-5)
要遍历查找,您只需使用find:
即可for file in "`find "$1"`"; do
echo "$file" | cut -d/ -f6-
done
这是我从你的问题中得到的。