【问题标题】:bash spaces in dir names using find cause linebreaks in ls目录名称中的 bash 空格使用 find 导致 ls 中的换行符
【发布时间】:2021-07-06 05:50:29
【问题描述】:

我无法处理文件名中的空格

脚本: 使用 find 我选择所有目录,它们被输入 ls 以计算目录中的文件数

bash 代码:

#!/bin/bash

for adir2 in $(find . -type d);
do
        echo "[$adir2]"
        DIRCOUNT=$(ls -1A $adir2 |wc -l)
        if [ $DIRCOUNT -eq 0 ]; then
          echo $adir2 "is empty"
        fi
done

测试设置:

mkdir testdir
cd testdir
mkdir 01\ dir

在此处运行脚本

结果:

[.]
[./dir]
./dir is empty
[./01]
ls: cannot access './01': No such file or directory
./01 is empty
[dir]
dir is empty

我使用的是 Ubuntu 20

备注: 以下不起作用:

find /path/to/dir -empty -type d

显示所有目录。 显然空属性不存在。 该位置是带有 ext4 分区的外部 USB 驱动器。

【问题讨论】:

  • 看起来像 askubuntu.com/questions/344407/… 的副本(我可能会用喜欢 find -print0xargs -0 拼凑一些东西)
  • @MikaelÖhman 重复的问题并没有真正帮助我,但您的建议绝对是正确的,谢谢!对我有用的代码:'DIRCOUNT=$(find . -type d -print0 | xargs --null ls -1A|wc -l)'。接下来是将其分配给 adir2 但这会做。
  • 另见BashPitfalls #1
  • @CharlesDuffy 非常感谢您的推荐

标签: bash ubuntu ls


【解决方案1】:

这应该可以满足您的要求:

#!/usr/bin/env bash

while read -d '' adir2
do
        echo "[$adir2]"
        dircount=$(ls -1A "$adir2" | wc -l)
        if [ "$dircount" -eq 0 ]; then
          echo "[$adir2] is empty"
        fi
done < <(find . -type d -print0)

尽量避免使用全大写的变量。

【讨论】:

  • 我唯一有问题的地方是它错误地暗示$'\0'''有任何不同;由于 bash 使用 C 字符串,而 C 字符串不能包含 NUL 文字,它们完全相同相同。
  • 有没有没有的情况?如果你运行s1=''; s2=$'\0'[[ "$s1" = "$s2" ]] 为真,${#s1}${#s2} 均为0。你如何区分它们?
  • @CharlesDuffy 我使用$'\0' 来明确分隔符是什么。它是 NUL 字符。使用'' 依赖于知道C 字符串以\0 结尾并且read -d 执行无条件的delimiter[0] 查找。我不认为依靠它是好的风格。 -d 说它需要一个字符,所以我们应该传递一个。
  • @JohnKugelman,……当然,这两种方法都有缺点。显式 $'\0' 的问题在于,它向读者暗示它做了一些有用的事情,因此暗示 bash 使用 C 字符串——这使得看过该代码的人更有可能是当他们无法将二进制数据存储在常规字符串变量中而不破坏它时,他们会感到惊讶,f / e。我宁愿阅读代码让某人查找真正的语义实际上是什么,而不是让他们认为他们已经知道并理解这些语义但是错了。
  • 太好了,这个终于完美了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2021-12-26
相关资源
最近更新 更多