Как “захватить” соответствие файлам из файла поиска в ударе?

# lsuser -a minlen minage support
support minlen=8 minage=0

# chuser minage=1 minlen=6 support 

# lsuser -a minage minlen support 
support minage=1 minlen=6
1
28.01.2013, 18:13
2 ответа

Возможно, что-то вдоль следующих строк:

sed -e 's;^.*$;\^&\$; list-of-names > list-of-patterns

rm $(find . -type f | grep -v -f list-of-patterns)

Будьте осторожны, это, конечно, повредится, если имена файлов будут содержать пробелы или символы, которые оболочка считает особенным. Проверьте то, что это удалило бы прежде, чем выполнить его для реального!

(Мог бы быть способ обойти файл шаблона, но первое, что пришло на ум я не вижу его).

1
27.01.2020, 23:39
  • 1
    более безопасный путь: 1) переместитесь, файлы соответствия в их новом месте назначения 2) удаляют остающееся (после того, как пользовательское подтверждение для продолжения) –  Olivier Dulac 28.01.2013, 18:34
  • 2
    Право. Но затем у Вас есть к munge пути, и это более сложно, чем просто обнаружение файлов для удаления. В любом случае не делайте этого, если Вы не знаете то, что собирается произойти и рассмотреть резервное копирование полного оригинала на всякий случай. –  vonbrand 28.01.2013, 18:40
  • 3
    другая вещь: Ваша находка отобразит имена как:./name1./name2./subdir/name3 и Вы пытаетесь соответствовать ему к '^somename$':ничего не выйдет. возможно, в этом случае воссоздайте list-of-patterns быть: ^.*/&$ вместо ^&$ –  Olivier Dulac 28.01.2013, 19:44
  • 4
    @OlivierDulac, Заскок. Потребность \< и \> вместо ^ и $.Спасибо! –  vonbrand 28.01.2013, 19:46
  • 5
    , который я действительно рекомендую способу, которым я поместил его, как иначе, если subdir соответствует одному из имени файла, Вы заканчиваете тем, что удалили содержание всего этого subdir... iow 'осторожный с тем топором, eugene' (топор замены с комнатой ^^, это - песня ZZtop), –  Olivier Dulac 28.01.2013, 19:48

Следующий сценарий удара (предупреждение: непротестированный!) перемещает файлы из-под /directory/with/the/files к под /matched/files. Только файлы, имя которых (без каталога) находится в /path/to/lookup.file перемещены. Остерегайтесь этого, если существуют символьные ссылки на каталоги в /directory/with/the/files, они пересечены рекурсивно, как будто они были самими каталогами.

#!/bin/bash
shopt -s globstar
set -f; IFS=$'\n'
typeset -A filenames
for x in $(cat /path/to/lookup.file); do filenames[$x]=1; done
set +f; unset IFS
cd /directory/with/the/files
for x in ./**; do
  if [[ -d "$x/." ]]; then
    : # skip directories and symbolic links to directories
  elif [[ -n ${filenames[${x##*/}]} ]]; then
    # the file is matched, move it under /matched/files
    mkdir -p "/matched/files/${x%/*}"
    mv "$x" "/matched/files/$x"
  else
    # the file isn't matched
    :
  fi
done

Объяснения:

  • shopt -s globstar включает ** шарик для пересечения каталогов рекурсивно.
  • set -f; IFS=$'\n' выключает globbing и устанавливает новые строки как единственного ограничителя слова, так, чтобы неупомянутая замена команды $(cat /path/to/lookup/files) разделяется в новых строках только.
  • filenames ассоциативный массив.
  • for x in ./** заботится это $x всегда содержит часть каталога (этот путь ${x%/*} часть каталога $x, с . для каталога верхнего уровня), и не начинается - (таким образом, это не рискует рассматриваться как опцию).
  • ${x##*/} расширяется до части имени файла $x, т.е. $x без части каталога.
1
27.01.2020, 23:39
  • 1
    Спасибо. когда я сохраняю это как сценарий оболочки, я добираюсь fileextractor.sh: 1: fileextractor.sh: shopt: not found fileextractor.sh: 3: fileextractor.sh: typeset: not found fileextractor.sh: 4: fileextractor.sh: Syntax error: "fi" unexpected (expecting "done") –  user31333 29.01.2013, 11:24
  • 2
    @user31333 Это - сценарий удара, необходимо работать, он с ударом (запустите с a #!/bin/bash строка). –  Gilles 'SO- stop being evil' 29.01.2013, 11:33
  • 3
    Да я сделал это, и я выполняю его как это sh ./fileextractor.sh из каталога сценария. Все еще получите вывод выше хотя??? –  user31333 29.01.2013, 11:59
  • 4
    Хорошо это работает теперь. Однако я добираюсь ./fileextractor.sh: line 17: syntax error near unexpected token fi'' –  user31333 29.01.2013, 12:31
  • 5
    @user31333, Если у Вас нет ничего для выполнения else часть, любой добавляет a : (никакая-op команда), или удаляют else. –  Gilles 'SO- stop being evil' 29.01.2013, 14:38

Теги

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