Это тема WordPress, верно? У меня была та же проблема, и я тоже обвинял Apache, но решение, которое я нашел, на самом деле было настройкой WordPress.
См.https://codex.wordpress.org/Editing_wp-config.php#Override_of_default_file_permissions
На моем конкретном сервере WordPress использовал свои собственные настройки прав доступа к файлам (и игнорировал бит SGID )так же, как вы описали. Я не знаю, в чем причина, но это кажется преднамеренным. Решение для меня состояло в том, чтобы добавить конкретную маску разрешений в файл wp -config.php :
.
define( 'FS_CHMOD_DIR', 02775 );
0 == восьмеричная
2 == установить SGID
755 == rwxrw -rw -разрешения
С существующими файлами и каталогами WordPress, установленными с правильным разрешением (, включая SGID для всех каталогов ), новые файлы и каталоги, созданные плагинами WordPress (, темами, загрузками ), использовали маску файла 02755. и унаследовал правильное владение группой. ПРИМЕЧАНИЕ. Данные пользователя Apache www -также должны быть в группе.
Подробнее:
создана группа для использования всеми пользователями SFTP и Apache :sudo groupadd sftp -grp.
добавить Apache в группу sftp -grp :sudo usermod -a -G sftp -grp www -data
добавить обычных пользователей в группу sftp -grp, как указано выше.
сделать все файлы WordPress принадлежащими Apache, но с общей группой :sudo chown -R www -data :sftp -grp /var/www/path -для -вордпресс
убедитесь, что все файлы WordPress доступны для группового чтения/записи (возможно, потребуется повторно -рассмотреть возможность использования.htaccess и wp -config.php ):sudo chmod -R g+rw /var/ www/путь -к -wordpress
добавить бит SGID в основной каталог WordPress :sudo chmod g+s /var/www/path -в -wordpress
... и все подкаталоги :sudo find /var/www/path -to -wordpress -type d -exec chmod g+s '{}' \;
добавлено в wp -config.php :определить ('FS _CHMOD _DIR', 02775 );
Для этого можно использовать grep
:
$ grep -vwf <(cut -d, -f1 file1) file2
test4
grep
опции:
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-w, --word-regexp
Select only those lines containing matches that form
whole words.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line.
Таким образом, в совокупности grep -vwf patternFile inputFile
означает "найти те строки из файла шаблона, которые никогда не присутствуют как целые слова в файле ввода".
<(command)
:это называется заменой процесса и в оболочках, которые его поддерживают, (например. bash )он будет действовать как файл. Это позволяет нам использовать вывод команды cut
в качестве «файла» для параметра grep -f
.
cut -d, -f1 file1
:напечатать только 1-е, разделенное запятой -поле файла1. Обратите внимание, что вы можете использовать-x
(совпадение всей строки )вместо только -w
, если ваши данные действительно такие, как показано:
-x, --line-regexp
Select only those matches that exactly match the whole line.
Так:
$ grep -vxf <(cut -d, -f1 file1) file2
test4
Кроме того, если ваш file1
может содержать любые символы регулярного выражения (.
, *
, ?
и т. д. ), вы также можете использовать -F
:
-F, --fixed-strings
Interpret PATTERNS as fixed strings, not regular expressions.
Так:
$ grep -Fvxf <(cut -d, -f1 file1) file2
test4
Именно для этой настройки
grep -ffile2 -v file1
test3
подойдет. Но -имейте в виду, например. ложные срабатывания, которые потребуют принятия дополнительных мер.
:~$ cat > toto
a b
c d
e f
:~$ cat > titi
a b
d e
f g
:~$ awk 'NR==FNR{c[$1]++;next};c[$1] == 0' toto titi
d e
f g
Это всего лишь пример, который я взял из своего списка примеров, вы можете использовать его для обхода своих нужд.
Использование cut
иgrep
:
grep -F -x -v -f <(cut -d',' -f1 file1) file2
cut -d',' -f1 file1
печатает первое поле file1
, а grep
использует вывод в качестве входного файла шаблона (опция-f
). Опции -F
и -x
используются для сопоставления фиксированных -строк и целых строк, а -v
инвертирует совпадения.
Возможность awk
предположить, что первое поле в file1
содержит имя файла, а разделитель полей всегда,
awk -F"," 'NR==FNR{test[$1]=1}NR!=FNR{if (!test[$1]) print $1}' file1 file2
(См. упрощенную версию @Terdon в комментариях, а затем объединив ее с моей
awk -F"," 'NR==FNR{test[$1]++}!test[$1]{print $1}' file1 file2
)
Альтернативное использованиеjoin
join -t, -v2 <(sort file1) <(sort file2)