Я хотел бы выполнить противоположность:
find . -name "*2013*"
Найдите все файлы в текущем каталоге, которые не содержат строку «2013» в своих именах. Как я могу это сделать?
Я хотел бы выполнить противоположность:
find . -name "*2013*"
Найдите все файлы в текущем каталоге, которые не содержат строку «2013» в своих именах. Как я могу это сделать?
Ответы:
Просто:
find . ! -name '*2013*'
Добавьте также, ! -type d
чтобы исключить файлы типа directory (как и .
самого себя) или -type f
включить только обычные файлы, исключая все другие типы файлов (каталоги, fifos, символические ссылки, устройства, сокеты ...).
Остерегайтесь, однако, что *
соответствует последовательности из 0 или более символов . Таким образом, он может сообщать имена файлов, которые содержат, 2013
если этому 2013
предшествует или следует что-то, что не может быть полностью декодировано как допустимые символы в текущей локали.
Это может произойти, если вы находитесь в локали, где символы могут быть закодированы более чем в один байт (как в UTF-8) для имен файлов, которые закодированы в другой кодировке. Например, в локали UTF-8 он сообщит о Stéphane2013
файле, если é
он был закодирован в наборе символов iso8859-15 (как байт 0xe9).
Лучше всего убедиться, что имена файлов закодированы в наборе символов локали, но если вы не можете гарантировать это, обходной путь должен выполняться find
в локали C:
LC_ALL=C find . ! -name '*2013*'
Ksh шаблонов файлов достаточно:
# files with 2013
ls -d -- *2013*
# files without 2013
ls -d -- !(*2013*)
Если ваша оболочка bash, вам нужно запустить ее, shopt -s extglob
прежде чем использовать этот шаблон (вы можете поместить его в свой .bashrc
). Если ваша оболочка - zsh, вам нужно запустить ее setopt ksh_glob
(вы можете поместить ее в свою .zshrc
). Zsh также предлагает ls -d -- ^*2013*
, что требует предварительного setopt extended_glob
.
В зависимости от того, что вы делаете с этими именами файлов, ls
может быть неправильной командой для использования. Хранить их в массиве
filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
Найти все файлы в текущем каталоге, которые не содержат определенную строку, здесь «2013»:
find . ! -name "*2013*" -type f
ls
возвращает сообщение об ошибке, если шаблон не соответствует ни одному файлу). Также обратите внимание, чтоksh
отсортирует список.