Я хотел бы выполнить противоположность:
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отсортирует список.