Як я можу подати ls на grep та видалити файли, відфільтровані grep?


33

Я хотів видалити якийсь пакет із домашнього файлу, але ім'я файлу було занадто довгим ( google-chrome-stable_current_i386.deb). Отже, я вирішив скористатися командою ls|grep chrome|rmдля передачі файлів grep, щоб відфільтрувати хромований файл, а потім видалити його. Це не спрацювало, тому я хотів би побачити, як я можу це зробити.


22
rm -i *chrome*.deb
Ламберт

28
Взагалі кажучи, мені не подобається, коли люди публікують відповіді "не робіть цього", але це один з найкращих прикладів XY-проблеми, яку я коли-небудь бачив. Ваше справжнє запитання - "як я швидко видаляю файл з довгим ім'ям файлу, не вводячи все це", і є безліч хороших способів, які не передбачають прив'язування результатівls
Michael Mrozek

5
Просто використовуйте find- find . -name "*chrome*" -delete.
Борис Павук


3
Мої два центи як користувач StackExchange: надалі задайте своє питання більш загальним способом, надаючи детальну інформацію про те, що ви спробували. "Як видалити будь-які файли в папці з певним рядком у назві файлу?" можливо, це був би кращий спосіб сформулювати це. Тоді ви могли б просто додати, як в сторону, що ви намагалися трубопроводу lsчерез grepдо , rmале не міг змусити його працювати. Таким чином ви отримаєте одну-дві гарні відповіді про "правильний" чи "найпростіший" спосіб виконання свого завдання, а не змушувати когось дати хорошу відповідь про неефективне рішення.
Адріан

Відповіді:


56

Це мало не змусило мене похмуріти.

  1. Можливо, ви захочете зупинити вказівку на цю рушницю біля вашої ноги. В основному будь-який вид аналізу lsбуде складнішим і схильним до помилок, ніж встановлені методи, такі як find [...] -execабо глобус .
  2. Якщо хтось не встановив для вас дистрибутив тролів, ваша оболонка має Tabзавершення. Просто введіть rm googleі натисніть Tab. Якщо це не завершиться негайно, натисніть Tabще раз, щоб переглянути список відповідних файлів. Введіть більше символів імені файлу, щоб звузити його, поки воно не завершиться, а потім запустіть команду.
  3. Труби ! = Параметри . Стандартний вхід - це двійковий потік даних, який може подаватися команді асинхронно. Параметри - це рядки, розділені пробілом, які передаються один раз і лише один раз команді під час її запуску. Вони дуже рідко взаємозамінні.

1
Вибачте, якщо це здалося питанням до n00b. Я знав, що це нормально використовувати в цілому, так як зазначений пакет був єдиним пакетом з "хромом", зазначеним у ньому. Тому за допомогою grep було б відфільтрувати лише один файл. Я досить новачок в Linux, і я вже зробив багато скриптів bash, але я ще не знаю все: P. Суворо, чувак.
SpecialBomb

5
Це не означало бути суворим, але оболонка - це суворе і невблаганне середовище, приховане за якоюсь зручною для користувача поверхнею. Робити речі безпечно досить складно, не заважайте надійно чи навіть правильно .
l0b0

2
@SpecialBomb Це єдина правильна відповідь. Пояснення, як правильно націлити дробовик, щоб чисто відрізати ногу, як це роблять інші відповіді, - це, звичайно, не шлях. Будьте особливо уважні до сліпого виконання rm- це, мабуть, єдиний більш поширений спосіб посмажити ваш дистрибутив.
Борис Павук

@BoristheSpider Хе, я, безумовно, вже смажив Ubuntu двічі, встановлюючи драйвери графічних карт AMD. Я вже задавав питання з цього приводу. AMD був жахливим, тому я запитав, чи є якісь загальні виправлення чи кращі методи гри з Linux на картці AMD.
SpecialBomb

34

Ви також можете скористатися командою find за допомогою підстановки:

find . -maxdepth 1 -name '*chrome*' -delete

Зауважте, що аргумент "-maxdepth" гарантує, що знаходження працює лише в поточному каталозі, і не повторюється в підкаталогах.


1
Пропозиції щодо вдосконалення: (a) використання -inameдля нечутливих до регістрів імен файлів (b) для xargsвикористання -print0прапора findта -0прапор для xargs. Використання xargsдозволяє робити такі речі, як "інтерактивні" (підтвердити видалення foo?) Видалення .
Крістофер Шульц

3
Якщо ви користуєтесь опцією -exec, не потрібно передавати файли xargs:find . -name '*chrome*' -exec rm -i {} +
Johnny

4
Чи не буде це також рекурсивно видалятись у підкаталогах? Можливо, вам потрібно буде вказати номер maxdepth1.
Тизоїд

32

Ви мали правильну ідею, просто пропустили деякі деталі. Оскільки ви маєте справу зі списком, що надходить до STDIN, і rmочікуєте параметрів, вам потрібно скористатися xargs.

Таким чином:

ls | grep chrome | xargs rm

Слід дати вам те, що ви хочете.

Зауважте, що якщо ви хочете видалити все, крім chromeфайлу, ви можете просто додати -vдо grepзаяви.

Зауважте, що за іншими відповідями на це питання, мабуть, це поганий спосіб досягти того, що ви хочете досягти.


З -v, хіба це не видалить усе, крім файлів, які відповідають chrome? Я не думаю, що цього хоче ОП ...
akivajgordon

Подивившись знову, ти маєш рацію. ОП хоче "відфільтрувати хромований файл", але потім хоче його видалити.
Іван

Це здається зайвим складним, порівняно з простим "rm -i chrome "
chander

5
Прийнята відповідь працює, але дивіться відповідь нижче, яка пояснює, чому це погана ідея. (Публікуйте цей коментар тут лише заради тих, хто зупиняється, як тільки вони бачать "прийнятий" галочку.)
Джим Девіс

1
Це прийнята відповідь "працює" лише в тому випадку, якщо у lsвиході немає "дивних" імен файлів . Імена файлів з пробілами скасують це. Це також небезпечно, якщо хтось може сконструювати назву файлу зі спеціальним соусом у каталозі, де ви це запускаєте. Як вже вказувало більше однієї людини, не розбирайте висновок ls !
Стівен П

11

Ніколи не розбирайте висновок ls
Моя пропозиція полягає у тому, щоб уникнути розбору результатів ls [ 1 ] , навіть більше, якщо вони поєднуються з delкомандою. Це з багатьох причин стосується головним чином несподіваних та не звичайних символів, дозволених у імені файлу.

Навіть коли ви очікуєте, що назви файлів, що належать до пакетів Linux, "будуть добре себе вести" , ця проблема все-таки може з'явитися, якщо в цьому каталозі присутні інші файли, але ви цього не знали чи не помічали.

Краще використовувати findрозширення вкладки (почати писати ім’я та натиснути Tab), розширення імені файлу [ 2 ] як *MyKey*...


Швидке рішення
Оскільки ви хочете вибрати всі пакунки (які закінчуються .deb) за допомогою "google" всередині, ви можете скласти свій запит за допомогою підстановки * *google*.debі зробити простий

rm -i *google*.deb 

що вибере кожне ім'я файлу з "google" посередині, яке закінчиться для .debприсутнього в поточному каталозі. Опція -i(інтерактивна) підкаже підтвердження, добра звичка при видаленні файлів з розширенням параметра.


Розчин близько до філософії вашої спроби
Якщо ваша мета побудувати свій шматок командного рядка після частини, так що ви зробили ls, після того ls | grep google, і тільки після того, як ви перевірили ваш висновок ви можете виконати його в субоболочке $(...)з

rm -i $(ls | grep google)

Більш швидкий і небезпечний спосіб [ 3 ] - це використання!!

ls | grep google
rm -i $(!!)

яка виконає останню завершену команду у вашій історії . Ви можете захистити себе від того , що у вас немає візуального контролю лінії , яку ви збираєтеся виконати , якщо ви включили заздалегідь параметри оболонки histverifyз shopt -s histverify.


5
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;

< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

... використовувати -name '*c*.deb'або якийсь інший візерунок, як підходить вам замість цього.


2

rmне приймає дані від stdin. Вам потрібно буде зробити щось на кшталтls google-chrome* | xargs rm

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