Знайдіть імена файлів, які не містять вказаний рядок


19

Я хотів би виконати протилежне:

find . -name "*2013*"

Знайдіть усі файли в поточному каталозі, які не містять рядок "2013" у своїх назвах. Як я можу це зробити?

Відповіді:


28

Просто:

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

4

Шаблонів імені файлу 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

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.