«Отказано в доступе» при создании папки в каталоге tmp - PullRequest
0 голосов
/ 14 января 2020

Я создаю скрипт, который подсчитывает количество каталогов и файлов. Я пытаюсь создать новый файл в папке 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

Ответы [ 2 ]

1 голос
/ 14 января 2020

Ваша find командная строка не уделяет достаточно внимания пробелам. У вас есть:

find $1 \( -type d -fprintf /tmp/dcount "\n" \) ,\( -type f -fprintf /tmp/fcount"\n" \)

Вам нужен пробел после , и еще один перед вторым "\n", и вы должны использовать двойные кавычки вокруг $1:

find "$1" \( -type d -fprintf /tmp/dcount "\n" \) , \( -type f -fprintf /tmp/fcount "\n" \)

Однако GNU find отклоняет исходную команду с различными ошибками - вам действительно нужно опубликовать точные копии того, что вы выполняете (copy'n'paste неоценим). Не рискуйте перепечатывать его - вы будете совершать глупые ошибки, которые будут выглядеть так, будто вы небрежны.

Вам также не нужны операнды \( или \):

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
0 голосов
/ 14 января 2020

Ошибка прав доступа, вероятно, связана с тем, что вы пытаетесь найти каталог, к которому у вас нет доступа. Использование /tmp не должно приводить к возникновению ошибок разрешений.

В любом случае этот сценарий можно упростить. Нет необходимости записывать временные выходные файлы в /tmp. Вот одна более простая версия:

#!/bin/bash

 dirCount=$(find $1 -type d | wc -l)
 fileCount=$(find $1 -type f | wc -l)
 echo Directory Count: $dirCount
 echo File Count: $fileCount

Если это было сохранено, например, в файле сценария с именем countstuff, а ваш домашний каталог был /home/alice, то вы можете запустить этот скрипт следующим образом :

 countstuff /home/alice

Если вам не нужны результаты, хранящиеся в переменных, а вы просто хотите отобразить результаты, то этот скрипт может быть сокращен еще больше:

#!/bin/bash

echo Directory Count: $(find $1 -type d | wc -l)
echo File Count: $(find $1 -type f | wc -l)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...