生成包含所有空子文件夹名称的文件

时间:2017-03-07 01:45:09

标签: bash shell unix

我想编写一个脚本,该脚本将文件夹的名称作为命令行参数,并生成一个文件,其中包含大小为0的所有子文件夹的名称(空子文件夹)。这就是我得到的:

#!/bin/bash
echo "Name of a folder'
read FOLDER

for entry in "$search_dir"/*
do 
     echo "$entry"
done

2 个答案:

答案 0 :(得分:3)

您的脚本没有您想要的逻辑。 find命令具有此

的功能
$ find path/to/dir -type d -empty

将打印从给定路径/到/ dir

开始的空目录

答案 1 :(得分:0)

我建议您接受建议使用find的答案。但只是为了完整,这里有一些关于你的代码的反馈。

  • 您将输入目录读入FOLDER但从不使用此变量。
  • 另外,不要使用大写字母作为私有变量;这是为系统变量保留的。
  • 提示字符串中包含未配对的引号。如果开头报价是双倍,则需要用双引号关闭,反之亦然。单引号。
  • 你循环遍历目录条目,但不做任何事情只隔离目录,更不用说空目录了。
  • 最后,您的脚本中没有任何内容使用仅限Bash的工具,因此使用#!/bin/sh
  • 会更安全,更便携

现在,可以使用search_dir/*/而不是search_dir/*来完成循环目录;并且通过检查目录中的通配符是否仅返回目录本身,可以找出哪些是空的。 (这假设默认的通配行为 - 使用nullglob你会创建一个没有匹配的通配符扩展到空列表,但这在某些情况下是有问题的,因此它不是默认值。)

#!/bin/bash

# read -p is not POSIX
read -p "Name of a folder" search_dir

for dir in "$search_dir"/*/
do
     # [[ is Bash only
     if [[ "$dir"/* = "$dir/*" ]]; then  # Notice tricky quoting
         echo "$dir"
     fi
done

使用带有[的通配符扩展是有问题的,因为它不准备处理通配符扩展 - 你会得到太多的参数"如果通配符扩展为多个文件名 - 所以我使用稍微温和的Bash替换[[来处理这个问题。或者,您可以使用case,我实际上更喜欢这里;但是我坚持if才能对您的脚本进行微小的更改。