array=${ls -d */}
echo ${array[@]}
我有三个目录:
ww
、ee
和qq
。我想把它们放到一个数组中,然后打印出这个数组。ARR+=('$(ls -d */)')
编辑数组中的元素,同时使用单引号来处理特殊字符,以添加或删除元素到该数组中。单引号保留字面字符并消除了在目录名称中处理它们所需的转义需要。 - YokaiARR+=("$(ls -d */)")
应该可以工作。如果不行,请告诉我。 - Yokaimapfile -t contents < <(ls -d -- *)
原始解决方案存在两个问题:(i)不支持路径中的空格,(ii)以破折号开头的文件名被解释为ls
的参数而不是文件名。 - Christoph Thiedels
的输出(请参阅Greg关于此主题的维基百科)。基本上,如果文件名中有奇怪的字符,则ls
的输出将是模糊的。这通常也是浪费时间的。在这种情况下,当您执行ls -d */
时,发生的情况是shell将*/
扩展为子目录列表(这已经是您想要的),将该列表作为参数传递给ls -d
,后者查看每个子目录,说“没错,那确实是一个目录”,并打印它(以不一致和有时模糊的格式)。ls
命令没有做任何有用的事情!*/
将保持不变,ls
将搜索名为“*” 的子目录,找不到它,将其打印为不存在的错误消息(到stderr),并且不会将“*/”打印出来(到stdout)。*/
)而不是将其传递给ls
。但是,为了避免在没有实际子目录的情况下将“*/”放入数组中,您应该首先设置nullglob(再次请参见Greg的维基百科):shopt -s nullglob
array=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later
echo "${array[@]}" # Note double-quotes to avoid extra parsing of funny characters in filenames
if (( ${#array[@]} == 0 )); then
echo "No subdirectories found" >&2
fi
ls
是一个简单的命令,它的输出是字符串。Bash在解析字符串方面非常出色。正确的正则表达式就足以安全地解析ls
的输出。 - Yokails
在文件名中使用有趣/非打印字符时会执行不同的操作,因此没有一种一致的方法可以将其输出解析为文件名列表。正如我所说,它实际上并没有做任何有用的事情:如果您正确解析 ls -d */
的输出,您最终得到的东西与直接从 */
得到的完全相同(除非没有匹配项,这很容易检查)。 - Gordon Davissonshopt
在 Debian 或其衍生发行版中默认情况下不包含,因此可能不是一个足够便携的选项。不过我确实喜欢 glob 的想法。 - Yokai这将逐行打印这些目录中的文件。
array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"
filesArray=(*.mp4)
filesCount=${#filesArray[@]}
for (( i=0;i<$filesCount;i++)); do
singleFile="${filesArray[$i]}"
#here I replace ALL the spaces in the file's name, by underscores.
trimmed=${singleFile// /\_}
mv "${singleFile}" "${trimmed}"
echo "renamed ${singleFile} as ${trimmed} !"
done