Как найти и изменить разрешения для одного типа файла в терминале Ubuntu?

1883
David Thomas

Возможное дублирование:
Как выполнить chmod 755 для всех каталогов, но без файла (рекурсивно)?

Я только что обновил Ubuntu 8.04 до 9.04, добавил дополнительный жесткий диск /homeи использовал iPod (FAT32, к сожалению) для хранения / передачи файлов между тем.

Копируя эти файлы обратно, я обнаружил, что большинство файлов, я думаю, из-за проблем, связанных с ненадлежащим / ненадлежащим образом установленными разрешениями в FAT32, теперь chmod +xв какой-то момент эффективно отредактированы.

Мне было интересно, есть ли простой способ найти все файлы определенного типа (скажем .txtили .css) и направить их напрямую chmod -x? Я пробовал поискать по различным фразам на этом сайте и нескольких других, но ничего не смог найти. Хотя это может быть проблема со словарем, я думаю.

Спасибо за любую помощь, которую вы, ребята, можете предоставить, и за ваше время.

1
Пожалуйста, измените название, чтобы отразить фактический вопрос. nagul 14 лет назад 2
у этого дубликата есть тот же самый основной вопрос и гораздо лучший ответ: http://superuser.com/questions/91935/how-to-chmod-755-all-directories-but-no-file-recursively quack quixote 14 лет назад 0

4 ответа на вопрос

3
SilentGhost
chmod -R a-x *.txt 

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

Будет ли это искать * все * `.txt` файлы на машине, или мне придется назначать определенные каталоги? И, поскольку я могу быть идиотом, что делают переключатели / аргументы? Также +1 за ответ =) David Thomas 14 лет назад 0
`-R` - рекурсивное изменение, также существует длинная опция:` --recursive`. Я думаю, что это делает только текущий каталог. `ax` устанавливает` -x` для всех (пользователь, группа и другие). SilentGhost 14 лет назад 0
если у вас есть установленный каталог, в котором вы хотите выполнить это, выполните `cd / mydirectory`, затем выполните команду chmod Roy Rico 14 лет назад 0
Это не сработает. Параметр --recursive действует только в том случае, если * .txt включает какие-либо каталоги, и в этом случае * все * файлы в этих каталогах будут подвергнуты chmodded. Ryan Thompson 14 лет назад 1
0
Roy Rico

Командная строка также может использовать синтаксис типа regexp, поэтому вам нужно будет выполнить команду только один раз.

cd /to/my/directory chmod -R a-x *.(txt|css|whatever) 

Хорошо, я пытался проверить это, но это не совсем работает, я ищу правильный синтаксис, но я знаю, что это возможно. Спасибо.

В это время..

Это определенно работает (и, безусловно, излишне):

find /to/my/directory -type f | egrep "(txt|css)$" | xargs -t -i{} chmod a-x {} 

Объяснение:

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

egrepкоманда будет выводить каждую строку, которая соответствует регулярному выражению. "(txt|css)$"Регулярное выражение говорит, что нужно каждый файл, который заканчивается ($) с TXT или CSS.

xargsкоманда будет принимать вывод команды и трубы его в вход другой команды (которая приходит после него). например:

$> echo a\nb\nc  a b c  $> echo a\nb\n\c | xargs echo a b c 

как обычно, вы могли бы это сделать, find -type f | xargs echoно иногда выходной файл может быть очень длинным, если у вас много файлов, поэтому я считаю, что лучше разбить его. Су. опция -i выполняет команду для каждой строки вывода, значение каждой строки сохраняется в переменной, которую я определяю как {}. Команда -t выводит каждую команду, сгенерированную на стандартный вывод, чтобы вы могли видеть, что происходит.

Я бы добавил, что вы должны использовать find -print0 | xargs --null для обработки файлов с пробелами в их именах. Ryan Thompson 14 лет назад 0
вам придется найти другой способ сделать это, команда grep не работает (или, кажется, не со мной) с опцией -print0. Roy Rico 14 лет назад 0
Grep также имеет нулевые опции, -z и -Z для ввода и вывода соответственно. Но вам не нужен grep здесь. Find уже имеет опции -regex и -iregex. Вам просто нужно что-то вроде find DIR -типа f -iregex '\. (Txt | css) $' | xargs --null КОМАНДА Ryan Thompson 14 лет назад 0
ах, круто, я не использовал опцию -iregex, поэтому мне придется попробовать это. Roy Rico 14 лет назад 0
шаблоны оболочки - это так называемые шаблоны глобуса, а не регулярные выражения. И ваша команда будет разбивать имена файлов с пробелами или кавычками. Это довольно сложно безопасно распечатать, а затем проанализировать имя файла. Обход каталогов перегружен гочами. например, http://stackoverflow.com/questions/1841737/hashing-multiple-files-recursively/1842746#1842746 Если вы можете использовать find -print0 | grep -0 | xargs -0, обычно ты в порядке. Peter Cordes 14 лет назад 0
0
Ryan Thompson

В качестве ответа на ваш актуальный вопрос, найти | Решение XARGS является правильным.

Однако для решения вашей корневой проблемы невозможно правильно восстановить все права доступа к файлу без ссылки. Если у вас есть свободное место, вы можете создать виртуальную машину, установить все те же пакеты (чтобы узнать, как выполнить поиск dpkg get set selection) в качестве реальной машины, а затем «скопировать» разрешения, используя опцию chmod --reference.

Если вы решите пойти по этому пути, я могу отредактировать свой пост с более подробными инструкциями.

Это было / домой, что он перевел с использованием FAT32, так что, по крайней мере, большинство из них не заботятся о завязках. Peter Cordes 14 лет назад 0
0
Peter Cordes

Ах, выяснить, как трудно было использовать tar для восстановления / восстановления. :(

find . -type f -name '*.txt' -exec chmod -x {} +

Или с любым другим селектором, который вы хотите, например find -regextype posix-extended . -type f -iregex '.*\.(txt|css|html)' -exec chmod -x {} +

На самом деле, вряд ли что-либо в вашем домашнем каталоге должно быть исполняемым, поэтому я бы начал с простого find -type f(без -name), а затем сделал бы вещи исполняемыми по мере необходимости. Может быть, chmod в режиме 664, если вы в конечном итоге работали в режиме всего 777, так как вам не нужно разрешение на запись для ваших файлов (или каталогов). На самом деле, chmod ow -R ~ хорошая идея.

Некоторые файлы не должны быть доступны для чтения другим пользователям на той же машине, например ~ / .bash_history, ~ / .ssh, ~ / Mail и т. Д. (В зависимости от того, что у меня есть в домашнем каталоге, что может иметь значение)

 CD chmod 600 .bash_history .esd_auth .githistory .ICEauthority .lesshst .mcoprc .netrc * .pulse-cookie. недавно использованный * .viminfo .Xauthority .xsession-errors chmod 700 .dbus .gconf * .gnome * .gnupg .icedteaplugin .kde .macromedia .metacity Почта .mozilla .openoffice.org * .pulse .purple .Skype .ssh .thumbnails .tsclient .update-notifier  chmod 2700 .gnupg # супер-ультра-параноик, наверное. chmod 500 .gvfs # gvfs - это странно, а может и не присутствовать в текущей Ubuntu? 

скопировать / вставить это в терминал. Не беспокойтесь об ошибках, я уверен, что у вас нет тех же файлов и каталогов, которые есть у меня. (и я пропустил много неясных, которые на самом деле являются просто каталогами для сохранения игр и могут быть публично читаемыми без вреда.) Как правило, если вы не хотите, чтобы ваш pr0n-тайник или какое-либо упоминание о нем появлялось у других пользователей. найдите результаты или другие поиски, убедитесь, что ваши файлы истории и т. д. являются частными.

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