4

Я хотел бы развести файловую систему. В настоящее время мой bash-скрипт рекурсивно распечатывает файловую систему в файл (ls -l -R) и выводит ее с ожидаемым выводом.

Пример строки в этом файле: drw ---- 100000f3 00000400 0 ./foo/

Моя текущая команда diff - это diff "$ TEMP_LOG" "$ DIFF_FILE_OUT" --strip-trailing-cr --changed-group-format = '%>' --unchanged-group-format = '' >> "$ SubLog"

Как вы можете видеть, я игнорирую дополнительные строки в текущем выходном файле, я забочусь только о строках, которые соответствуют основному выводу.

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

Например:

Output:

------- 00000000 00000000      528 ./foo/bar.txt

Master:

------- 00000000 00000000      200 ./foo/bar.txt

Здесь различаются только размеры, и это не имеет значения, я хотел бы просто игнорировать определенные части различий, что-то вроде комментария.

Master:
------- 00000000 00000000      /*200*/ ./foo/bar.txt

-- ИЛИ ЖЕ --

Master:
d------ 00000000 00000000        /*10*/ ./foo//*123123*///*76456546*//bar.txt

Output:
d------ 00000000 00000000        0 ./foo/asd/sdf/bar.txt

И все-таки сделайте это правильно.

Возможно ли это даже с помощью diff, или мне придется написать собственный скрипт для него? Поскольку я довольно новичок в Cygwin, возможно, я использую совершенно неправильный инструмент, я рад любым предложениям.

Обновление 1:

Делая шаг назад, вот основная задача, которую я хочу достичь. Я хочу написать скрипт, который проверяет файловую систему, чтобы увидеть, правильно ли установлены разрешения на чтение / запись. Структура файловой системы находится под моим контролем, поэтому мне не нужно беспокоиться о ее слишком большом изменении. Иногда папки / файлы могут отсутствовать, но если они являются их разрешениями, необходимо проверить.

Например, предположим, что ниже приведен снимок текущей структуры файловой системы.

drw ./foo
drw ./foo/bar
-rw ./foow/bar/bar.txt
drw ./foo/baz
-rw ./foo/baz/baz.txt

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

drw ./foo
drw ./foo/bar
-rw ./foo/bar/bar.txt
--- ./foo/bar/foobar.txt
drw ./foo/baz
-rw ./foo/baz/foobaz.txt

В этом случае с файловой системой все в порядке, поскольку все файлы соответствуют их ожидаемым значениям. Ситуация усложняется, как только некоторые папки могут иметь произвольное имя, только из-за их расположения я знаю, какими должны быть их разрешения. Предположим, что каталог ./foo/bar в приведенном выше примере может быть таким случаем, то есть вместо бара папка может иметь любое имя, но при этом соответствовать разрешениям -rw.

Это выглядит как очень сложная ситуация, и я даже не уверен, смогу ли я решить ее с помощью сценариев bash. Возможно, мне придется написать реальное заявление.

Обновление 2:

Обратите внимание, что я не могу запускать инструменты в файловой системе напрямую. Все, что у меня есть, - это файл, содержащий выходные данные команды 'ls -l' R ', которая производит выходные данные, как указано выше.

Я добавил дополнительный разбор вывода, вывод system / master теперь имеет формат

d------ ./path
drw---- ./path2

3 ответа3

1

Возможно, проще злоупотребить rsync чтобы получить то, что вы ищете, и потенциально выполнить всю задачу, хотя вам, возможно, придется подавить его желание обновить файл - так или иначе, это дневная работа rsync:

  • rsync --existing -iprvn a/ b

Возможны следующие варианты:

        --existing              skip creating new files on receiver
    -p, --perms                 preserve permissions
    -i, --itemize-changes       output a change-summary for all updates
    -r, --recursive             recurse into directories
    -v, --verbose               increase verbosity
    -n, --dry-run               perform a trial run with no changes made

Теперь давайте создадим тест. Здесь у нас есть две директории, у каждой есть файл, которого нет у другой; b также имеет a+x на 1 .

$ ls -lah a/ b/
a/:
total 8.0K
drwxrwxr-x  2 ecarroll ecarroll 4.0K Apr  5 16:38 .
drwxr-xr-x 71 ecarroll ecarroll 4.0K Apr  5 16:38 ..
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:38 1
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:38 2
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:38 5

b/:
total 8.0K
drwxrwxr-x  2 ecarroll ecarroll 4.0K Apr  5 16:52 .
drwxr-xr-x 71 ecarroll ecarroll 4.0K Apr  5 16:38 ..
-rwxrwxr-x  1 ecarroll ecarroll    0 Apr  5 16:52 1
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:52 5
-rw-rw-r--  1 ecarroll ecarroll    0 Apr  5 16:38 7

Теперь давайте запустим rsync.

$ rsync --existing -icprvn a/ b
sending incremental file list
.f...p..... 1

sent 97 bytes  received 15 bytes  224.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
  • f означает, что это файл.
  • p означает, что разрешения отключены.
  • 1 - это просто имя моего файла примера.
-1

Если вам нужна только часть разрешений ls , вы можете просто разобрать ее с помощью awk .

ls -l your-file | awk '{print $1;}'

В качестве альтернативы вы можете проверить разрешения в PHP-скрипте, используя функцию fileperms .

-1

Я думаю, что все, что вам нужно, это:

find . -type f -printf "%M %p\n"

Учитывая это, вы, вероятно, можете записать в файл и использовать diff.

http://manpages.debian.net/cgi-bin/man.cgi?query=find

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .