需要帮助编辑脚本

时间:2016-01-06 21:14:05

标签: linux unix scripting

我想创建一个脚本,将目录名作为输入,然后解析该目录中的所有子目录,并显示每个子目录中输入日期的文件计数(以YYYYMMDD格式)在文件名中。

现在我有这个:

#!/bin/bash

clear

echo "Please enter date in YYYYMMDD format ";
read date;
dirList=`ls -d *`
for d in $dirList ; do
  count=`find $d -name "*$date*" | wc -l`
  echo $d : $count
done

这只是浏览当前目录中的所有子目录并正确显示解决方案。如何编辑它以获取目录路径的输入并在该目录中执行相同操作?

1 个答案:

答案 0 :(得分:2)

你想知道如何(1)读取一个目录名(来自stdin,大概就是你从中获取输入的那个),以及(2)使用该目录的持续时间您的脚本的执行情况?

没什么比这更简单了:

read -p "Please enter directory to start from: " dir
cd "$dir" || exit

也就是说,脚本的其余部分也可能有一些错误修正:

for d in */; do
  count=$(find "$d" -name "*${date}*" -printf '\n' | wc -l)
  echo "$d: $count"
done

使用ls -d *在几个方面都有错误:

  • 它实际上并没有将自己限制在目录
  • 它将ls的结果字符串拆分,将名为dir with four words的目录视为四个单独的目录dirwithfour和{ {1}}
  • 我们无法保证其名称中包含不可打印字符的目录(words实施'行为不同)正常工作。

同样地,由于缺少引号,ls是错误的:

  • 名为echo $d : $count的目录会将dir with * wildcard扩展为当前目录中所有文件和目录的列表。
  • 名称中带有标签的目录或多个空格的运行会丢失该信息。

同样地,*也不保证是准确的计数:如果文件名在其名称中包含换行符,则find "$d" -name "*${date}*" | wc -l的某些实现将在其输出中包含那些作为文字的那些,导致find多次计算该文件(对于每个换行符);因此wc只为每个标识的文件打印一个换行符,而不是一个名称。