linux - 在 tmp 目录中创建文件夹时“权限被拒绝”
问题描述
我正在创建一个计算目录和文件数量的脚本。我正在尝试在 tmp 文件夹中创建一个新文件,它通过在该新文件中插入新行来跟踪有多少目录。但是,当我运行脚本时,我得到一个权限被拒绝'find /tmp/dcount'。
我在这个目录中拥有 r,w,x 权限,并且也是所有文件/目录的所有者。
#!/bin/bash
find $1 \( -type d -fprintf /tmp/dcount "\n" \) ,\( -type f -fprintf /tmp/fcount"\n" \)
dirCount=(wc -l /tmp/dcount| cut -d" " -f1)
fileCount=(wc -l /tmp/fcount| cut -d" " -f1)
printf "Directory Count %d" dirCount
printf "File Count %d" fileCount
解决方案
您的find
命令行对间距不够关注。你有:
find $1 \( -type d -fprintf /tmp/dcount "\n" \) ,\( -type f -fprintf /tmp/fcount"\n" \)
,
在 the 之后需要一个空格,在 second 之前需要一个空格"\n"
,并且应该在周围使用双引号$1
:
find "$1" \( -type d -fprintf /tmp/dcount "\n" \) , \( -type f -fprintf /tmp/fcount "\n" \)
然而,GNUfind
拒绝原始命令并出现各种错误——您确实需要发布您正在执行的内容的精确副本(copy'n'paste 非常宝贵)。不要冒险重新输入它——你会犯愚蠢的错误,让它看起来好像你很粗心。
您也不需要\(
or\)
操作数:
find "$1" -type d -fprintf /tmp/dcount "\n" , -type f -fprintf /tmp/fcount "\n"
现在您需要决定使用临时文件名是否是一个好主意。你可以简单地写:
echo "Directory Count $(find "$1" -type d -print | wc -l)"
echo "File Count $(find "$1" -type f -print | wc -l)"
由于没有临时文件,因此 (a) 没有文件权限问题写入此类文件,并且 (b) 您不必在脚本完成(或因中断而终止)时删除它们。
唯一的缺点是对 . 下的目录层次结构进行了两次扫描"$1"
。
请注意,如果您必须保留文件名,则应至少.$$
在名称中使用:-fprintf /tmp/dcount.$$
以确保程序的并发执行不会相互干扰。为了安全(不可预测的名称),您应该使用:
dcount=$(mktemp /tmp/dcount.XXXXXX)
fcount=$(mktemp /tmp/fcount.XXXXXX)
trap "rm -f $dcount $fcount; exit 1" 0 1 2 3 13 15
find "$1" -type d -fprintf "$dcount" "\n" , -type f -fprintf "$fcount" "\n"
echo "Directory Count" $(wc -l <"$dcount")
echo "File Count" $(wc -l <"$fcount")
rm -f "$dcount" "$fcount"
trap 0
推荐阅读
- javascript - 使用显示 console.log 'undefined' 的点表示法调用的对象属性
- sql - SQL 将值插入到 ID 等于的特定列中
- python - 如何在熊猫中创建计算的新列
- python - 如何在 selenium 上将多个文本连接在一起?
- php - 允许的用户角色的 WooCommerce 优惠券使用限制
- c# - 如何在 C# 中获取 JSON 中的最后一项
- vba - 从 Outlook 项目中提取最后更新的时间戳
- css - Bootstrap vue:表单组标签样式
- c++ - 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- javascript - 使用 HTTP PUT 获取后 setState 挂钩未更新