首页 > 解决方案 > 在 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

标签: linuxbash

解决方案


您的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

推荐阅读