Як змусити знайти найбільш послідовні, але не всі символічні посилання?


10

Моя ОС та домашній каталог знаходяться на SSD. Я зберігаю кілька великих файлів на жорсткому диску і посилаюсь з домашнього каталогу на жорсткий диск (наприклад, ~ / Videos / Films - це посилання на / mnt / hdd / Films). У мене також є ряд префіксів Wine, кожен з яких має dosdevices / z: symlinked to /.

Тож, якщо я використав функцію find без -L, вона пропустить усе, що є на жорсткому диску. Але якщо я використовую find з -L, він закінчується циклом через симпосилання Wine to /.

Чи є якийсь розумний спосіб вирішити це питання, щоб знайти пошуки там, де я цього хочу? Інтуїтивно, мені хочеться чогось уздовж рядків "дотримуйтесь символьних посилань, якщо тільки вони не знаходяться в каталозі під назвою dosdevices". "Дотримуйтесь символьних посилань, які є на чомусь на жорсткому диску", також буде працювати.

Відповіді:


11

-pruneПервинного каже findНЕ Recurse в директорії.

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

Якщо ви хочете використовувати -lnameу своєму стані, ви не можете використовувати цю -Lопцію, оскільки -Lзмушує більшість предикатів діяти на ціль посилання, в тому числі -lname. Моєю рекомендацією в цьому випадку буде використання як домашнього каталогу, так і кореня жорсткого диска як коренів вашого пошуку.

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

Ви можете бігти, find ~ -type l …щоб зібрати список символьних посилань і використовувати їх як додаткові корені.

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

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

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

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

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


Дякую! -pruneце лише те, що я шукав. Я знайшов, що find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype dперераховує всі символьні посилання, за якими я не хочу слідувати; Зараз я намагаюся знайти спосіб використовувати цей запит для обрізки.
Марк Реймонд

@MarkRaymond Загальний принцип такий find ~ <negative criteria> -prune -o <positive criteria> -print, тожfind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
перестань бути злим"

@Giles - це прекрасно працює без -L, але як тільки я додаю -L, вирази -імен більше не працюють (як на сторінці man каже, що вони не будуть). Так що в основному мені тоді потрібні деякі умови, щоб слідувати посиланнями, а інші не робити!
Марк Реймонд

Я не можу придумати спосіб зробити саме те, що ти хочеш, щоб знайти. Перегляньте мою редакцію для деяких наближень.
Жил "ТАК - перестань бути злим"

1

Щоб шукати ВСІ посилання, це працювало для мене:

find -L . -name \*.txt

0

Скільки посилань на жорсткі диски у вас є? Якщо не занадто багато, одне рішення - не використовувати "-L", чітко вказуючи символьні посилання, які ви хочете виконувати в командному рядку find. Щось на зразок:

find .  ~/Videos/Films -name '*file I want*' ...

Це дозволить здійснити пошук у поточному каталозі ("."), А також посилання "~ / Відео / Фільми", але не сходитиме до інших символьних посилань.


0

Іншим рішенням, яке стоїть на шляху вирішення проблеми (принаймні для мого випадку), є використання прив'язки кріплення замість символічних посилань для каталогів на жорсткому диску. Це робиться шляхом додавання записів у /etc/fstabтакому вигляді:

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

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