Як знайти й змінити дозволи на один тип файлів на терміналі Ubuntu? [дублювати]


1

Можливі дублікати:
Як chmod 755 всі каталоги, але не файл (рекурсивно)?

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

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

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

Дякуємо за будь-яку допомогу, яку ви, хлопці, можете надати, і за свій час.


2
Будь ласка, змініть назву, щоб відобразити фактичне запитання.
nagul

цей дублікат має одне й те саме базове питання та набагато кращу відповідь: superuser.com/questions/91935/…
quack quixote

Відповіді:


3
chmod -R a-x *.txt

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


Чи буде це шукати все .txt файли на машині, або мені доведеться призначати конкретні каталоги? І, оскільки я можу бути ідіотом, що роблять комутатори / аргументи? Також, +1 для відповіді =)
David Thomas

-R це рекурсивна зміна, існує також довгий варіант: --recursive. Я думаю, що він робить лише поточний каталог. a-x набори -x для всіх (користувача, групи та інших).
SilentGhost

якщо у вас є каталог, який ви хочете виконати, виконайте команду a cd /mydirectory, потім виконайте команду chmod
Roy Rico

1
Це не спрацювало. Параметр --recursive має ефект тільки якщо .txt містить будь-які каталоги, у цьому випадку * всі файлів у цих каталогах буде chmodded.
Ryan Thompson

0

Командний рядок може також використовувати синтаксис типу 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 {}

Пояснення:

The find команда буде перераховувати всі файли, посилання та каталоги, кожен на окремому рядку. Назва шляху визначає початкову точку. The -type f опція вказує лише на пошук файлів.

egrep команда виведе кожен рядок, який відповідає регулярному виразу. The "(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 але вихід може іноді отримати дуже довго, якщо у вас є багато файлів, так що я вважаю, краще розбити його. soo. Опція -i виконує команду для кожного рядка виводу, значення кожного рядка зберігається в змінному, визначеному як {}. Команда -t виводить кожну команду, яка генерується в std, щоб ви могли бачити, що відбувається.


Додам, що ви повинні використовувати find -print0 | xargs --null для обробки файлів з пробілами в їхніх іменах.
Ryan Thompson

вам доведеться знайти інший спосіб зробити це, команда grep не працює (або не здається мені) з опцією -print0.
Roy Rico

Grep також має null параметри, -z і -Z для введення і виведення відповідно. Але вам не потрібна grep. Знайти вже має опції -regex і -iregex. Вам просто потрібно щось подібне до пошуку DIR-типу f -iregex '(txt | css) $' | xargs --порожній КОМАНД
Ryan Thompson

ах здорово, я не використовував -iregex варіант, так що мені доведеться спробувати це.
Roy Rico

Шаблони оболонок - це так звані шаблони глобусів, а не регулярні вирази. І ваша команда розбила б на імена файлів пробіли або лапки. Це дуже важко безпечно роздрукувати, а потім розібрати ім'я файлу. Обхід каталогів обтяжений gotchas. напр. stackoverflow.com/questions/1841737/… Якщо ви можете використовувати find -print0 | grep -0 | xargs -0, ви, як правило, добре.
Peter Cordes

0

Як відповідь на ваше актуальне питання, знайти | Рішення xargs є правильним.

Однак, щоб вирішити вашу кореневу проблему, неможливо правильно відновити всі права доступу до файлів без посилання. Якщо у вас є простір, ви можете створити віртуальну машину, встановити всі ті ж пакети (щоб дізнатися, як шукати dpkg встановлювати вибір), як вашу реальну машину, а потім "копіювати" дозволи, використовуючи chmod --reference.

Якщо ви вирішите піти цим маршрутом, я можу редагувати свій пост з більш детальними інструкціями.


Він / домашній, що він перейшов з використанням fat32, так що принаймні більшість з них не дбає про perms.
Peter Cordes

0

Ах, з'ясувавши важкий шлях, ви повинні були використовувати 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 (без імені), а потім виконайте виконувані речі за необхідності. Можливо, chmod до режиму 664, якщо ви закінчили всім 777, тому що ви не хочете, щоб у ваших файлах (або директоріях) було дозволено записувати світ. Так насправді, chmod o-w -R ~ - хороша ідея.

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

    cd
    chmod 600 .bash_history .esd_auth .githistory  .ICEauthority .lesshst .mcoprc .netrc* .pulse-cookie .recently-used* .viminfo .Xauthority .xsession-errors
    chmod 700 .dbus .gconf* .gnome* .gnupg .icedteaplugin .kde .macromedia .metacity Mail .mozilla .openoffice.org* .pulse .purple .Skype .ssh .thumbnails .tsclient .update-notifier

    chmod 2700 .gnupg  # super-ultra-paranoid, I guess.
    chmod 500 .gvfs  # gvfs is weird, and maybe not present on current ubuntu?

копіювати / вставляти в термінал. Не турбуйтеся про помилки, я впевнений, що у вас немає тих самих точкових файлів і каталогів, які я роблю. (і я залишив безліч незрозумілих, які дійсно є лише каталогами для збереження ігор, і можуть бути відкритими для читання без шкоди.) Як правило, якщо ви не хочете, щоб ваш pr0n stash або будь-яка згадка про нього відображався в інших знайдіть результати або інші пошукові запити, переконайтеся, що файли історії тощо є приватними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.