Передача нескольких каталогов к - сокращает опцию в находке

Число является страницей справочника, к которой оно относится. Каждая страница справочника имеет свою собственную цель, как то, чтобы быть страницей справочника для определения POSIX или определенного определения Linux (для программистов) или страницей справочника для самого использования инструментов, если можно вызвать его от командной строки.

цель определенной страницы справочника покрыта первым разделом

man 8 fsck

покажет Вам определенную страницу

man -a fsck

покажет Вам страницу после страницы после выхода с q

9
29.04.2013, 21:10
4 ответа

Насколько я знаю, нет никакой опции сказать find считать шаблоны из файла. Легкое обходное решение должно сохранить шаблоны, которые я хочу исключить в файле и передать тот файл как вход для реверса grep. Как пример, я создал следующие файлы и каталоги:

$ tree -a
.
├── a
├── .aa
├── .aa.bak
├── a.bck
├── b
├── .dir1
│  └── bb1.bak
├── dir2
│   └── bb2.bak
├── b.bak
├── c
├── c~
├── Documents
│  └── Documents.bak
├── exclude.txt
├── foo.backup
└── Music
    └── Music.bak

Если я понял пример, Вы отправили правильно, Вы хотите переместиться a.bck, .aa.bak, b.bak, c~, foo.backup и dir2/bb2.bak к мусору и отпуску .aa.bak, .dir1/bb1.bak, Documents/Documents.bak и Music/Music.bak где они. Я, поэтому, создал файл exclude.txt со следующим содержанием (можно добавить столько, сколько Вы хотите):

$ cat exclude.txt 
./.*/
./Music
./Documents

Я использую ./.*/ потому что я понял Вашу исходную находку, чтобы означать, что Вы хотите переместить скрытые файлы резервных копий (.foo) это находится в текущем каталоге, но исключает любые файлы резервных копий, которые находятся в скрытых каталогах (.foo/bar). Так, я могу теперь работать find команда и использование grep исключить нежелательные файлы:

$ find . -type f | grep -vZf exclude.txt | xargs -0 --no-run-if-empty trash-put

Опции Grep:

   -v, --invert-match
          Invert  the  sense  of matching, to select non-matching
          lines.  (-v is specified by POSIX.)
   -f FILE, --file=FILE
          Obtain patterns from FILE, one  per  line.   The  empty
          file  contains  zero  patterns,  and  therefore matches
          nothing.  (-f is specified by POSIX.)
   -Z, --null
          Output a zero byte (the ASCII NUL character) instead of
          the  character  that normally follows a file name.  For
          example, grep -lZ outputs a zero byte after  each  file
          name  instead  of the usual newline.  This option makes
          the output unambiguous, even in the  presence  of  file
          names  containing  unusual  characters  like  newlines.
          This  option  can  be  used  with  commands  like  find
          -print0,  perl  -0,  sort  -z,  and xargs -0 to process
          arbitrary file names, even those that  contain  newline
          characters.
4
27.01.2020, 20:06
  • 1
    я очень сожалею о том, что не был явным. Любезно посмотрите пересмотренный вопрос, который я надеюсь, более ясно. –  chandra 29.04.2013, 17:30
  • 2
    @chandra видит обновленный ответ, то же общее представление, различные детали. –  terdon♦ 29.04.2013, 21:01
  • 3
    . Вы ответили на мой вопрос очень ясно и отлично для моей цели. Я принял Ваш ответ. –  chandra 30.04.2013, 08:06

С GNU находят (т.е. в соответствии с невстроенным Linux или Cygwin), можно использовать -regex объединить все они -path подстановочные знаки в единственный regex.

find . -regextype posix-extended \
     -type d -regex '\./(\..*|Music|Documents)' -prune -o \
     -type f -regex '.*(\.(bck|bak|backup)|~)' -print0 |
xargs -0 --no-run-if-empty trash-put

С FreeBSD или OSX, использовать -E вместо -regextype posix-extended.

6
27.01.2020, 20:06
  • 1
    Спасибо за превосходный альтернативный ответ. Это - позор, что я не могу принять два ответа. –  chandra 30.04.2013, 08:07

Это, кажется, больше вопрос об оболочке, чем a find вопрос. С файлом, содержащим ( -name dir1 -o -name dir2 ) -prune (не "\"!) можно просто сделать это:

find ... $(< /path/to/file)

Не изменяя находку называют себя (к eval find или путем изменения $IFS), это работает с путями без пробела только, все же.

Если Вы хотите сохранить файл более простым, можно записать сценарий.

# file content
dir1
dir2
dir3

# script content
#!/bin/bash
file=/path/to/file
# file may be checked for whitespace here
grep '[^[:space:]]' "$file" | { empty=yes
  while read dir; do
    if [ yes = "$empty" ]; then
      echo -n "( "
      empty=no
    else
      echo -n " -o "
    fi
    echo -n "-name ${dir}"
  done
  if [ no = "$empty" ]; then
    echo -n " ) -prune"
  fi; }

И используйте

find ... $(/path/to/script)

вместо этого.

1
27.01.2020, 20:06
  • 1
    я очень сожалею о том, что не был явным. Любезно посмотрите пересмотренный вопрос, который я надеюсь, более ясно. –  chandra 29.04.2013, 17:30
  • 2
    @chandra I ни видит, как Ваш вопрос более ясен, и при этом я не понимаю то, что могло быть проблемой с моим решением (за исключением тривиального replecement -name path). –  Hauke Laging 29.04.2013, 19:27
  • 3
    Мой сценарий выше работ и делает то, к чему я хочу его. Я просто хотел знать, был ли более опрятный путь, чем \( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune исключить определенные каталоги из рекурсивного поиска это find делает. Я ничего не ищу в файлах, а скорее удаляю определенные файлы и избегаю определенных каталогов в моем пути поиска. Я не понимаю то, что Ваш сценарий пытается сделать также. Так, кажется, что у нас есть отсутствие передачи.Прошу прощения. Давайте оставим его в этом. –  chandra 29.04.2013, 20:48

Группа -path ... -prune в одно выражение, заключенное в \ (... \) с использованием логики -o ( или ).

find /somepath \( -path /a -prune -o \
                  -path /b -prune -o \
                  -path /c -prune \
               \) \
               -o -print

В примере не выполняется итерация каталогов или файлов в или ниже / somepath / a , / somepath / b и / somepath / c .

Вот более конкретный пример использования нескольких действий.

find / \( -path /dev -prune -o \
          -path /proc -prune -o \
          -path /sys -prune \
       \) \
       -o -printf '%p ' -exec cksum {} \;
2
27.01.2020, 20:06

Теги

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