# 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
Возможно, что-то вдоль следующих строк:
sed -e 's;^.*$;\^&\$; list-of-names > list-of-patterns
rm $(find . -type f | grep -v -f list-of-patterns)
Будьте осторожны, это, конечно, повредится, если имена файлов будут содержать пробелы или символы, которые оболочка считает особенным. Проверьте то, что это удалило бы прежде, чем выполнить его для реального!
(Мог бы быть способ обойти файл шаблона, но первое, что пришло на ум я не вижу его).
Следующий сценарий удара (предупреждение: непротестированный!) перемещает файлы из-под /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
без части каталога.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
#!/bin/bash
строка).
– Gilles 'SO- stop being evil'
29.01.2013, 11:33
sh ./fileextractor.sh
из каталога сценария. Все еще получите вывод выше хотя???
– user31333
29.01.2013, 11:59
./fileextractor.sh: line 17: syntax error near unexpected token
fi''
– user31333
29.01.2013, 12:31
else
часть, любой добавляет a :
(никакая-op команда), или удаляют else
.
– Gilles 'SO- stop being evil'
29.01.2013, 14:38
list-of-patterns
быть:^.*/&$
вместо^&$
– Olivier Dulac 28.01.2013, 19:44\<
и\>
вместо^
и$
.Спасибо! – vonbrand 28.01.2013, 19:46