Як засвоїти команду пошуку UNIX?


11

Я думаю, що я досить просунувся у використанні пошуку, але КОЖЕН раз, коли я його використовую, я не можу на все життя запам’ятати метод закрити параметр -exec. Я витрачаю багато часу на читання кожного разу, коли ним користуюся. Я просто недостатньо використовую це чи занадто багато очікую від себе? Почнемо з типового прикладу, який мене засмучує.

У структурі каталогів є файли з усіма неправильними дозволами, приховані файли, символічні посилання тощо. Я хочу змінити право власності на розумне значення

find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;

(Пробачте, якщо закінчення зворотне ... Я дивився на це годину тому і досі не впевнений)

Але я боюся запустити його через кріплення, символічні посилання і т. Д. Я зробив остаточний привід chmod. * І раніше він повторювався вгору. Я знаю, -xdev відмовиться від перетину розділів, але я не впевнений, що буде з файлами, що живуть у каталогах, що є символічними посиланнями.

То як же один господар цього звіра може вбивати важливі файли?

Оновіть обрізку найкращих пропозицій нижче та підсумовуючи:

  1. Пов’язати каталог інтерактивних практик та встановити його до інших каталогів практик.
  2. Використовуйте xargs, а не неінтуїтивну команду exec.
  3. Використовуйте -exec echo {} для безпечності та безпеки
  4. Напіва двокрапка - особлива, і ви уникаєте її, тому перше місце втечі
  5. Команда -or може допомогти вам поєднати критерії вибору.

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


1
Я також не можу його згадати, тому я просто передаю його в xargs.
резонатор

2
Коли ви задоволені побудовою правильної команди, розгляньте запуск її з + замість \; Вона запуститься швидше за допомогою +, оскільки команда exec буде називатися набагато рідше.
wzzrd

wzzrd, чудова порада щодо використання +, а не \;
Даніель Лоусон

Відповіді:


19

Що ж, що стосується -execсинтаксису, ви можете зробити так, як багато людей, відмовитися і використовувати xargs:

find . -type f | xargs chown username

(або файли-з-пробілами та-інше-нісенітниця-в-безпечній версії)

find . -type f -print0 | xargs -0 chown username

Або, щоб спробувати пригадати , що потрібно робити з точкою з коми, що вам потрібно просвердлити в голову, що ви використовуєте точку з коми завершити команду , яка -execзапущена, і ви повинні бігти на точку з коми , тому що він має спеціальне значення для bash. Ось чому це зворотний кут з комою. Здається, у вас {}заміна частина нормальна.

Що стосується вбивства файлів тощо, якщо ви працюєте з чимось великим і небезпечним, як ви говорите, спочатку зробіть це:

find . -type f -exec echo chown username {} \;

і переглянути результати. Це в основному "сухий пробіг", де ви бачите команди, які він би виконував, якщо ви дозволите. Однозначно хороша практика. Не допоможе у вирішенні .*проблеми, але ви знаєте, що не робити цього зараз. :)


1
+! для "ехо" практики сухий хід. Я завжди використовую це для великих змін
Стів Фоллі,

3

Я здивований, що ще ніхто не згадав наступний варіант:

find . -type f -ok chown username {} \;

Цей синтаксис підтвердить команду перед її виконанням. Він найкраще працює, якщо ви очікуєте, що ваш збір буде відносно невеликою кількістю файлів, оскільки він підкаже для кожного з них.

Деякі відповіді згадують xargs, але GNU вважає, що теж непотрібно:

find . -type f -exec chown username {} \+

Зауважте, що +, як правило, не потрібно уникати, але все-таки добре увійти в звичку робити це.


Чи можете ви пояснити природу знака плюс ... що саме це робить? Обробляє це оболонка або команда. Я думаю, я збираюся завантажити вихідний код для gnu-find, оскільки це цікава тема.
ojblass

Знахідка - це її обробка. Прочитайте людину, щоб дізнатися більше про цей варіант.
Kamil Kisiel

3

Це те, для чого людина: Це може бути важко запам’ятати, тому команда * nix включає чоловічі сторінки. Ви можете просто завжди перевіряйте розділ ACTION сторінки людини для нагадування про синтаксис: man find. Незважаючи на те, що сторінки чоловіків можуть здатися непривітними, коли ви добре читаєте їх, вони дуже зручні.

Зробити Front-End або Wrapper: Коли я хотів покращити пошук у GNU, я написав передній край GUI для пошуку, який генерує команди пошуку з python, glade та pygtk. Це гарна вправа, якщо ви хочете добре її познайомити.

Майте довідник практик: Нарешті, у мене в домашньому режисері завжди є каталог "брухту" для гри з потужними командами, коли щось на кшталт "ехо" не вирішує. Ви можете використовувати розширення оболонки, щоб швидко створити купу файлів із чимось на зразок:

for i in {1..100}; do touch "$i"; done

Дивний довідник практики - це те, про що я ніколи не розглядав.
ojblass

1

Ви також можете комбінувати вирази пошуку з операторами '-and' та '-or'. -і неявне:

find . -type f -name "plainfile" ...

те саме, що

find . -type f -and -name "plainfile" ...

Оператор або може зменшити ваш список з 4 команд до 2:

find . -type d -or -type f ...

І нарешті, не пов’язаний з пошуком, але чуун також може встановити групу. Отже, справляючись з пробілами в іменах, ми також закінчуємо:

find . -type d -or -type f -exec chown username:usergroup '{}' \;

Що можна знайти із бізнесом або [Sic]
ojblass

@ojblass: знайти комбіновані вирази, використовуючи 'і' або 'або', за замовчуванням, якщо не вказано ні '-and', ні '-or', '-and' використовується неявно. Отже, наберіть 'find -type d -type f' нічого не знайде, оскільки нічого не є каталогом і файлом.
Стів Фоллі

0

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


0

Залежно від версії знаходження, яку ви використовуєте, існують різні варіанти, які можуть вам допомогти. Знайти GNU, мабуть, найпотужніше, і це може допомогти вам у вашому другому (мається на увазі) запитанні

Наприклад - поведінка за замовчуванням полягає не у переналагодженні символічних посилань, але ви можете перекрити це; а параметр -mount перестає знаходити через точки монтажу

Подивіться на свої місцеві сторінки


0

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

Особисто я зазвичай просто запускаю пошук без exec

find /path/to/dir -name whatever

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

chown user:group `find /path/to/dir -name whatever`

Ідеальний приклад того, як "не" робити речі. Імена файлів з пробілами.
Ієн Келінг

Так, це потенційна проблема, яку я, мабуть, мав би визнати. Однак моя думка полягала в тому, щоб прочитати вихідний результат перед тим, як виконати що-небудь, де ви б помітили пробіли чи інші божевільні назви файлів.
theterreceive

0

Для деяких снарядів (не забийте) втечу {} для правильної поведінки.

\{\} or '{}'

знайти керівництво добре для освоєння пошуку.


Ні, ви цього не робите; знайти пробіжки просто чудово з {} такими, як вони є. Вони є частиною команди find: вони - маркер, який замінюється результатом команди find. Вони означають щось в баші лише при визначенні функцій або виклику змінних, тому ви можете просто використовувати їх, як і в оригінальному запитанні.
wzzrd

Це зі сторінки man. Я оновив, щоб сказати, що це не стосується bash.
Ян Келлінг

0

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

Якщо ви хочете повторитись через каталог і заглушити всі файли / каталоги, простий

chown -Rh користувач: usergroup user /

зробимо це. Переконайтеся, що ви використовуєте -h або chown, щоб переходити до символічних посилань.


Я не думаю, що це кросова платформа. Також не вдається з 247K файлів, як показало моє середовище практики. Я не впевнений, чому.
ojblass

Я думаю, ви знайшли помилку більше, ніж ви знайшли проблеми з кросплатформою. Яка версія та який статус виходу, коли вона не працює? Наскільки я можу сказати, вона вперше виникла у ранніх версіях bsd; це безумовно в sunos 5.3 і ultrix та irix. Скільки обробляється, перш ніж вийти з ладу?
chris

Ви маєте рацію, він працює на AIX 5.3, AIX 5.2, але не AIX 4.3, NCR, HP 11, HP 10.20 або моїх дистрибутивах DSL. У всіх випадках виявляється збій у файлах чи близько 60k файлів.
ojblass
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.