Найти имена файлов, которые не содержат указанную строку


19

Я хотел бы выполнить противоположность:

find . -name "*2013*"

Найдите все файлы в текущем каталоге, которые не содержат строку «2013» в своих именах. Как я могу это сделать?

Ответы:


28

Просто:

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*'

4

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

4
Это не повторяется в подкаталогах и пропускает точечные файлы (и lsвозвращает сообщение об ошибке, если шаблон не соответствует ни одному файлу). Также обратите внимание, что kshотсортирует список.
Стефан Шазелас

-1

Найти все файлы в текущем каталоге, которые не содержат определенную строку, здесь «2013»:

find . ! -name "*2013*" -type f

2
По сути, это то же самое, что и unix.stackexchange.com/a/102614/117549 от 3 лет назад, за исключением того, что вы добавили «-f», что делает этот ответ хуже.
Джефф Шаллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.