Сравните 2 файла на основе первого столбца и распечатайте несоответствующий

Это тема 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 -также должны быть в группе.

Подробнее:

  1. создана группа для использования всеми пользователями SFTP и Apache :sudo groupadd sftp -grp.

  2. добавить Apache в группу sftp -grp :sudo usermod -a -G sftp -grp www -data

  3. добавить обычных пользователей в группу sftp -grp, как указано выше.

  4. сделать все файлы WordPress принадлежащими Apache, но с общей группой :sudo chown -R www -data :sftp -grp /var/www/path -для -вордпресс

  5. убедитесь, что все файлы WordPress доступны для группового чтения/записи (возможно, потребуется повторно -рассмотреть возможность использования.htaccess и wp -config.php ):sudo chmod -R g+rw /var/ www/путь -к -wordpress

  6. добавить бит SGID в основной каталог WordPress :sudo chmod g+s /var/www/path -в -wordpress

  7. ... и все подкаталоги :sudo find /var/www/path -to -wordpress -type d -exec chmod g+s '{}' \;

  8. добавлено в wp -config.php :определить ('FS _CHMOD _DIR', 02775 );

2
13.02.2020, 19:18
5 ответов

Для этого можно использовать 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
3
28.04.2021, 23:23

Именно для этой настройки

grep -ffile2 -v file1
test3

подойдет. Но -имейте в виду, например. ложные срабатывания, которые потребуют принятия дополнительных мер.

0
28.04.2021, 23:23
:~$ 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

Это всего лишь пример, который я взял из своего списка примеров, вы можете использовать его для обхода своих нужд.

1
28.04.2021, 23:23

Использование cutиgrep:

grep -F -x -v -f <(cut -d',' -f1 file1) file2

cut -d',' -f1 file1печатает первое поле file1, а grepиспользует вывод в качестве входного файла шаблона (опция-f). Опции -Fи -xиспользуются для сопоставления фиксированных -строк и целых строк, а -vинвертирует совпадения.

2
28.04.2021, 23:23

Возможность 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)
1
28.04.2021, 23:23

Теги

Похожие вопросы