Як я можу шукати файл на всьому диску без того, щоб рекурсивно застрягати в / Томах?


4

Я шукаю файл txt, який містить слово. Однак, коли я шукаю жорсткий диск (або резервну копію TimeCapsule), я завжди застрягаю в рекурсивному пошуку / томів / жорсткого диска (тощо).

Жорстке посилання (або softlink, не впевнений) змушує мене ніколи не завершувати пошук.

Як я можу шукати файл по всьому жорсткому диску (або резервному диску), не зациклюючись на рекурсії?


2
Як ви його шукаєте? Прожектор не бентежить це і findне дотримується символічних посилань (хоча він буде проходити через інші томи, якщо не вказати -xваріант) ...
Гордон Девіссон

Прожектор не відображатиме результати для всього диска.
jaume

1
@jaume: Це робиться, якщо ви чітко наказате йому включити в результати системні файли та невидимі файли .
Гордон Девіссон

@GordonDavisson: Дякую, я цього не знав, я завжди використовую locateв Terminal, коли роблю широкий пошук у системі. У своєму коментарі вище я розглядав Spotlight як поле пошуку, яке з’являється при натисканні клавіші Space + Command, а не як функцію пошуку в Finder ...
jaume

Відповіді:


4

Використовуйте locate, grepабо findв командному рядку.

Відкрийте програми> Утиліти> Термінал і будь-яке використання:

  1. sudo locate -0 '*.txt' | xargs -0 grep WORD 2>/dev/null

    Замініть СЛОВ словом, яке ви хочете шукати. Це, безумовно, найшвидший метод.

    Я рекомендую спочатку відтворити базу даних locate для підвищення точності:

    sudo /usr/libexec/locate.updatedb

    Зауважте, що в OS X locateбаза даних створюється користувачем nobody. Це означає, що файли, приховані nobodyне, індексуються. Ви можете змінювати /usr/libexec/locate.updatedbта коментувати (тобто префікс #) цей розділ:

    if [ "$(id -u)" = "0" ]; then
         rc=0
         # 2013-03-08 jaume Correct mktemp
         export FCODES=`mktemp --tmpdir updatedbXXXX`
         chown nobody $FCODES
         tmpdb=`su -fm nobody -c "$0"` || rc=1
         if [ $rc = 0 ]; then
             install -m 0444 -o nobody -g wheel $FCODES /var/db/locate.database
         fi
         rm $FCODES
         exit $rc
     fi
    

    так що він індексується під користувачем root(це стосується OS X 10.8 (Mountain Lion), в інших версіях OS X locateможе індексувати файли по-різному).

  2. sudo grep -R --exclude-dir '/Volumes/<OS volume>' --exclude-dir '/Volumes/MobileBackups' --exclude-dir '/.Spotlight*' --exclude-dir '/.MobileBackups' --exclude-dir '/.DocumentRevisions*' --include '*.txt' WORD / 2>/dev/null

    Замініть WORD словом, яке ви хочете шукати, і <OS volume>назвою гучності вашої ОС. Використовувані grepваріанти:

    • -R: чи здійснює рекурсивний пошук у вказаному шляху, тобто в /. Якщо ви шукаєте резервну копію TimeCapsule, замініть /щось подібне /Volumes/TimeCapsule.

    • --exclude-dir: виключає вказані папки. Як бачите, я виключаю Spotlight, папку Versions та локальні папки TimeMachine. Якщо ви хочете шукати локальний диск лише під час встановлення вашої TimeCapsule, додайте --exclude-dir /Volumes/TimeCapsule.

    • --include '*.txt': вказує grepна пошук файлів, які відповідають *.txt.

    Додатково:

    • 2>/dev/null: надсилає помилки, щоб /dev/nullви їх не бачили.
  3. sudo find / ! -path '/.Spotlight*' ! -path '/Volumes/<OS volume>/*' ! -path '/Volumes/MobileBackups/*' ! -path '/.MobileBackups/*' ! -path '/.DocumentRevisions*' -name *.txt -type f -exec grep -H WORD {} + 2>/dev/null

    Знову замініть WORD словом, яке ви хочете шукати, і <OS volume>назвою гучності вашої ОС. Як і раніше, 2>/dev/nullнадсилає помилки, щоб /dev/nullви їх не бачили, а якщо шукаєте резервну копію TimeCapsule, замініть /щось подібне /Volumes/TimeCapsule.

    Використовувані findваріанти:

    • ! -path: виключити вказані шляхи. Якщо ви хочете шукати локальний диск лише під час встановлення вашої TimeCapsule, додайте ! -path /Volumes/TimeCapsule/*.

    • -name *.txt: пошук файлів з ім'ям * .txt. Як бачите, я виключаю Spotlight, папку Versions та локальні папки TimeMachine.

    • -type f: пошук лише у файлах, ігнорування символьних посилань, папок тощо.

    • grep -H WORD {}: grep-файл для WORD. -Hзмушує grepдрукувати ім'я файлу.

Вихід будь-якої з команд, наведених вище, виглядає так:

filename: matched line

Наприклад, під час пошуку "GNU":

/usr/local/share/doc/p7zip/DOCS/readme.txt:7-Zip is free software distributed under the GNU LGPL 
/usr/local/share/doc/p7zip/DOCS/readme.txt:1) You can compile and use compiled files under GNU LGPL rules, since 
/usr/local/share/doc/p7zip/DOCS/readme.txt:  copying.txt    - GNU LGPL license
/usr/local/share/doc/xz/history.txt:    Alexandre Sauvé helped converting the build system to use GNU

Якщо ви хочете зробити пошук без урахування регістру, замініть grepз grep -iвище.


re # 1- Я не впевнений, що потрібно редагувати у цьому файлі. Я запускаю команду find і в оригіналі файл не існував, тоді я побіг як адміністративний користувач і отримав помилкуlocate: locate database header corrupt, bigram char outside 0, 32-127: -1
goodguys_activate

Вам не потрібно редагувати /usr/libexec/locate.updatedb, це скоріше коментар для експертних користувачів, ніж щось, що вам потрібно зробити. Як я пишу, це стосується OS X 10.8, у вас може бути інша версія. Помилка, яку ви згадуєте: locate: locate database header corruptговорить про те, що база даних locate пошкоджена. Відтворити його , як описано у відповідь робити: sudo /usr/libexec/locate.updatedb. Ви можете видалити базу даних першої: sudo rm /var/db/locate.database. Якщо у вас є проблеми з відповіддю №1, спробуйте іншу, тому я описую 3 команди :-)
jaume

Чи вдалося вам створити базу даних locate? Я помітив, що locateкоманда була неправильною. Я це виправив. Чи можете ви спробувати це і подати звіт?
jaume

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