Як видалити кілька файлів із загальним префіксом та суфіксом?


21

У мене багато файлів з іменем

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

і файли з ім’ям

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

і файли з ім’ям

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

і

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

Я просто хочу видалити файли, які починаються з "послідовності_1" і закінчуються на ".hmf", але я не хочу видаляти їх по одному, оскільки є тисячі файлів. Як я можу вказати команді rm, що я хочу видалити все, що починається з попереднього фільму "послідовність_1" і закінчується в ".hmf"?

Зараз я працюю з системою RedHat Linux, але хотілося б знати, як це зробити і в інших дистрибутивах.

Відповіді:


28
rm sequence_1*.hmf

видаляє файли, починаючи з sequence_1і закінчуючи .hmf.


Globbing - це процес, коли ваша оболонка приймає шаблон і розширює її до списку імен файлів, що відповідають цьому шаблону. Не плутайте це з регулярними виразами, що відрізняється. Якщо ви проводите більшу частину часу в bash, у Wooledge Wiki є гарна сторінка про глобалізацію (розширення імені шляху) . Якщо ви хочете отримати максимальну портативність, ви також хочете прочитати специфікацію POSIX щодо відповідності шаблонів / замість цього.


У випадку навряд чи ви зіткнулися з помилкою "Аргумент надто довгий" , ви можете подивитися на BashFAQ 95 , який вирішує цю проблему . Найпростіший спосіб вирішити схему розбиття глобуса на кілька менших фрагментів, поки помилка не усунеться. У вашому випадку ви, ймовірно, можете піти з розбиття відповідності на префікси цифри від 0 до 9 таким чином:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case

Це дуже розумна робота над помилкою "список аргументів занадто довгий". У моєму випадку я маю двадцять тисяч файлів, тому, мабуть, мені доведеться використовувати цикл від 0, .., 20. Правильно?
Пол

@Paul Правильно, просто розбийте список на стільки шматочків, скільки вам потрібно, хоча в якийсь момент findпідхід стає простішим, ніж здогадуватися і перевіряти.
jw013

14

Хоча відповідь jw013 правильна wrt globbing, ця команда може не вдатися, якщо у вас є тисячі збігів: розширений командний рядок, rm sequence_1_0001.hmf sequence_1_0002.hmf ...сформований оболонкою, може бути занадто великим.

Як запропонував Дом, ви також можете скористатися -deleteопцією з find:

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

Як -maxdepthі -delete, в той час не в стандарті POSIX є досить поширеним в findреалізації в дикій природі. У дистрибутивах Linux зазвичай використовується GNU find, що, безумовно, підтримує ці варіанти.


2
Якщо ви можете, скористайтеся опцією -delete для пошуку, вона не розщедриться для кожного файлу ...
Dom

Додано, ура. Схоже, його -deleteслід підтримувати в останніх системах GNU та BSD, хоча -print0це лише GNU. Тож це, швидше за все, і портативніше (хоча це не повинно впливати на ОП).
Марно

Принаймні, у знаходженні OS X є -print0, але вона не входить у POSIX.
Лрі

5
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

також працював би в Баші.


bashЯ вважаю, що розширення дужок вимагає , і форма з нульовою підкладкою потребує версії 4.
jw013
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.