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