脚本失败,目录名中的空格(Script fails with spaces in directory

2019-09-02 00:43发布

我有一个非常简单的问题,我已经找到了一堆类似的问题回答,但没有就解决这对我来说。

我有一个shell脚本,通过目录进入,并打印出的文件和目录的子目录的数目,然后是目录名。

然而,它未能与空格的目录,它会尝试使用每个单词作为一个新的说法。 我试图把$目录中的报价,但没有帮助。 也许是因为它已经在回声报价。

for dir in `find . -mindepth 1 -maxdepth 1 -type d`
do
    echo -e "`ls -1 $dir | wc -l`\t$dir"
done

在此先感谢您的帮助 :)

Answer 1:

警告 :下面使用bash化的三个代码样本中的两个。 请小心,如果你需要POSIX SH而不是bash,以便使用正确的。


不要做任何的那些东西。 如果你真正的问题不使用find涉及,你可以用它像这样:

shopt -s nullglob
while IFS='' read -r -d '' dir; do
  files=( "$dir"/* )
  printf '%s\t%s\n' "${#files[@]}" "$dir"
done < <(find . -mindepth 1 -maxdepth 1 -type d -print0)

然而,对于迭代只顾眼前利益子目录,你并不需要找到所有:

shopt -s nullglob
for dir in */; do
  files=( "$dir"/* )
  printf '%s\t%s\n' "${#files[@]}" "$dir"
done

如果你想做到这一点与POSIX兼容sh的一种方式,你可以尝试以下方法:

for dir in */; do
  [ "$dir" = "*/" ] && continue
  set -- "$dir"/*
  [ "$#" -eq 1 ] && [ "$1" = "$dir/*" ] && continue
  printf '%s\t%s\n' "$#" "$dir"
done

你不应该永远使用ls脚本: http://mywiki.wooledge.org/ParsingLs

你不应该永远使用for读取行: http://mywiki.wooledge.org/DontReadLinesWithFor

计数文件时使用数组和水珠要做到这一点安全,稳健,且无需外部命令: http://mywiki.wooledge.org/BashFAQ/004

始终NUL,终止的文件列表出来的find -否则,包含换行符(!是的,他们是在UNIX法律)文件名可能会读取到一个名称为多个文件,或(在某些版本中找到和惯例)您“文件名”不符合实际文件名。 http://mywiki.wooledge.org/UsingFind



文章来源: Script fails with spaces in directory names
标签: shell