Я хотів би виконати протилежне:
find . -name "*2013*"
Знайдіть усі файли в поточному каталозі, які не містять рядок "2013" у своїх назвах. Як я можу це зробити?
Я хотів би виконати протилежне:
find . -name "*2013*"
Знайдіть усі файли в поточному каталозі, які не містять рядок "2013" у своїх назвах. Як я можу це зробити?
Відповіді:
Просто:
find . ! -name '*2013*'
Додайте до, ! -type d
щоб також виключити файли типу каталогу (наприклад, .
самого) або -type f
включити лише звичайні файли, виключаючи всі інші типи файлів (каталоги, фіфоси, символьні посилання, пристрої, сокети ...).
Однак остерігайтеся, що *
відповідає послідовності з 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*)
Якщо ваша оболонка баш, вам потрібно запустити, 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
буде сортувати список.