Извлечь файл и папки с указанными разрешениями

11

Я упаковываю папку с большим количеством подпапок и файлов в Windows с помощью 7zip, загружаю в VPS и затем запускаю команду:

tar -xvzf file.tar.gz

тогда все распакованные файлы и папки имеют разрешения 777. Как мне получить так, чтобы папки имели разрешения 755 и файлы 644?

Каспар Л. Пальги
источник
Существует веб-сайт под названием «Командная строка Фу», в котором также есть множество других идей.
Джангофан

Ответы:

13

Если вы работаете tar(1)как обычный пользователь, он будет применяться umaskпо умолчанию. Если вы работаете tar(1)как root, то вы можете дать --no-same-permissionsопцию командной строки, чтобы попросить tar(1)соблюдать umask.

Итак: либо запустите это как обычный пользователь:

umask 022
tar zxvf file.tar.gz

или запустите это как root:

umask 022
tar zxvf file.tar.gz --no-same-permissions

Вы можете придерживаться umask 022в ваш ~/.bashrc, ~/.bash_profileили ~/.profile. (См. bash(1)Man-страницу для полной информации о файлах запуска. Это сложно.)

Подробную информацию umaskможно найти на странице руководства вашей оболочки, на странице справки по umask(2)системному вызову или на umask(1posix)справочной странице утилиты, предоставляемой POSIX (если она manpages-posixустановлена).

sarnold
источник
umask 022 tar zxvf file.tar.gz -> это запрашивает у меня подтверждение для каждого файла отдельно, если я хочу извлечь его
Вы перезаписываете существующие файлы при этом?
sarnold
6

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

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Помните о месте между закрывающей фигурной скобкой и обратной косой чертой

alxbrd
источник
находка: отсутствует аргумент `-exec '
Любая идея, почему эта команда говорит мне "найти: отсутствует аргумент` -exec '"? Спасибо.
Добавьте пробел между закрывающей фигурной скобкой и\;
poussma
2

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

chmod -R ugo+X .
Стивен Куан
источник
1

Я нашел это решение, которое сработало для меня. Для папок и подпапок:

chmod -R 777 */

И для всех файлов (также в папках и подпапках):

find . -type f -name "*" | xargs chmod 644

Все комментарии приветствуются, если это не очень хороший способ сделать это. Я только начал изучать Linux.

После комментариев, более надежное решение, которое хорошо обрабатывает специальные символы:

find . -type f -print0 | xargs -0 chmod 644  # For files
find . -type d -print0 | xargs -0 chmod 755  # For directories
Каспар Л. Пальги
источник
Но вторая команда дает мне для многих файлов такой вывод: chmod: не может получить доступ к the': No such file or directory chmod: cannot access Logo.txt ': нет такого файла или каталога. Chmod: не может получить доступ к `./blog/wp-content/themes/OneRoom/LOGO': такого файла нет или ди приходской
2
777опасно и применимо только к очень небольшому меньшинству систем.
Сарнольд
2
Для того, чтобы улучшить вашу вторую команду find . -type f -print0 | xargs -0 chmod 644. В -name "*"этом нет необходимости, и он xargs(1)будет анализировать имена файлов через пробелы или символы новой строки, если только вы не используете -0-, который анализирует имена файлов по NULсимволу ASCII , который не может появляться в именах файлов. Команда -print0for find(1)просит его отформатировать вывод в режиме, подходящем для xargs -0ввода.
Сарнольд
0

находить . -type f -exec chmod 644 {} \;

Хамед
источник
2
Добро пожаловать в Superuser, имейте в виду, что ответы в одну строку принимаются редко, можете ли вы подробнее рассказать о своем ответе?
50-3