linux - 需要帮助编辑脚本

标签 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) 读取目录名称(大概是从标准输入读取,因为这是您获取输入的位置),以及 (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 的目录是四个独立的目录,dir , with , fourwords
  • 不保证能够正确处理名称中包含不可打印字符的目录(ls 实现的行为有所不同)。
<小时/>

同样,echo $d : $count由于缺少引号而存在错误:

  • 名为 dir with * wildcard 的目录会有 *展开为当前目录中所有文件和目录的列表。
  • 名称中包含制表符或连续多个空格的目录会丢失该信息。
<小时/>

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

关于linux - 需要帮助编辑脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34642873/

相关文章:

svn - 如何在 UNIX 上获取正确的 svn 版本号?

c++ - 使用 Boost Spirit 解析命令语言

linux - 从 Linux 终端运行 PERL 脚本时保留重音字母

html - 使用 bash sed 编辑 html 文件

asp.net - 将 visual studio 2015 中的 asp.net 5 发布到 linux

c - 如何使用 linux distro : ubuntu 16. 04 在 c 中使用 API

ruby - 如何查找在某个时间间隔内编辑过的 ruby​​ 文件?

linux - Mac 上 "size"命令中的数据段大小

powershell - 暂停 PowerShell 脚本直到操作完成,即打开和关闭记事本

linux - 检查多个变量是否为空并设置它们的值 bourne shell