Основная проблема с вашим кодом заключается в том, что вы собираете все имена путей в переменную, а затем выполняете цикл для вызова basename
. Это делает его медленным.
Цикл также проходит через раскрытие переменной без кавычек ${PATHLIST}
, что было бы неразумно, если имена путей содержат пробелы или символы оболочки. Вbash
(или других оболочках, которые его поддерживают ), вместо этого можно было бы использовать массив.
Предложение:
$ sed -e '1d' -e 's/^[^;]*;//' -e 's/;.*//' file.csv | sort -u | sed 's#.*/##' | sort | uniq -d
quad_list_14.json
Первый sed
выбирает пути (и отбрасывает строку заголовка ). Это также может быть записано как awk -F';' 'NR > 1 { print $2 }' file.csv
или как tail -n +2 file.csv | cut -d ';' -f 2
.
sort -u
дает нам уникальные пути, а следующий sed
дает нам базовые имена. Окончательный sort
с uniq -d
в конце говорит нам, какие базовые имена дублируются.
Последнее sed 's#.*/##'
, которое дает вам базовые имена, напоминает расширение параметра ${pathname##*/}
, которое эквивалентно $( basename "$pathname" )
. Он просто удаляет все до и включая последний /
в строке.
Основное отличие от вашего кода заключается в том, что вместо цикла, который вызывает basename
несколько раз, используется один sed
для создания базовых имен из списка путей.
Альтернатива просмотру только IN_OPEN
записей:
sed -e '/;IN_OPEN;/!d' -e 's/^[^;]*;//' -e 's/;.*//' file.csv | sort -u | sed 's#.*/##' | sort | uniq -d
Ознакомьтесь со списками ACL (Списками контроля доступа ), они обеспечивают более точное управление доступом, чем грубая группа владельцев --других моделей Unix. Однако не все файловые системы их поддерживают.
Вы можете использовать команду setfacl
для определенной папки и пользователя.
для пользователя;
sudo setfacl -Rm d:u:new_user:rwx /home
для группы;
sudo setfacl -Rm d:g:new_user:rwx /home
для проверки разрешений;
getfacl /home