Как удалить / удалить исполняемые файлы (иначе файлы без расширения) - PullRequest
7 голосов
/ 13 мая 2009

У меня есть каталог src /, который содержит много файлов .cc и его двоичные файлы. Например:

src/
  |_ foo.cc
  |_ bar.cc
  |_ qux.cc
  |_ thehead.hh
  |_ foo  (executable/binary)
  |_ bar  (executable/binary)
  |_ qux  (executable/binary)
  |_ makefile

На самом деле существует много .cc и исполняемых файлов.

Мне нужно удалить эти двоичные файлы без необходимости перечислять все файлы. Есть ли быстрый и компактный способ сделать это?

Я пытался:

$ rm *

но он удаляет все файлы, включая файлы .cc и .hh.

Мне известна эта команда:

$ rm foo bar qux ....

но тогда нам все еще нужно перечислить все файлы один за другим.

Ответы [ 8 ]

17 голосов
/ 13 мая 2009

вы можете запустить

find . -perm +100 -type f -delete
17 голосов
/ 13 мая 2009

Вот, пожалуйста:

ls | grep -v "\." | xargs rm

grep -v говорит "разрешать только имена файлов, которые не содержат точку", а xargs rm говорит "затем передать список имен файлов rm".

11 голосов
/ 13 мая 2009

Используйте find. То, что вы хотите, это:

find . -type f -executable -exec rm '{}' \;

Удаление всего без расширения также можно сделать:

find . -type f -not -iname "*.*" -exec rm '{}' \;

Первый вариант не удаляет Makefile, и поэтому предпочтителен. Я думаю, что ответ kcwu показывает хороший способ улучшить вышесказанное с помощью опции -delete:

find . -type f -executable -delete
find . -type f -not -iname "*.*" -delete

Редактировать : я использую GNU findutils find, версия 4.4.0, под Ubuntu 8.10. Я не знал, что переключатель -executable настолько необычен.

5 голосов
/ 14 мая 2009

Я бы лучше выбрал цель clean в Makefile. Скорее всего, он уже содержит список этих двоичных файлов, поэтому добавление цели clean не потребует особых усилий.

3 голосов
/ 13 мая 2009
find . -perm /ugo+x -delete

Исправленная версия первой команды Stephan202.

РЕДАКТИРОВАТЬ: Также попробуйте:

find . -perm /111 -delete

, который использует восьмеричный эквивалент

2 голосов
/ 13 мая 2009

Я предлагаю использовать сначала

find . -not -name "*.*" -exec ls -l {} \;

чтобы увидеть имена подходящих файлов.

и затем измените ls -l на rm

find . -not -name "*.*" -exec rm {} \;

также вы можете использовать запрос подтверждения, чтобы сделать его более безопасным:

find . -not -name "*.*" -exec rm -i {} \;
2 голосов
/ 13 мая 2009

Используйте команду find, чтобы удалить все файлы (не папки), которые не содержат символ точки:

find . \! -name "*.*" -type f -exec rm {} \;
2 голосов
/ 13 мая 2009

Вместо передачи -exec rm '{}' \; для поиска можно использовать -delete arg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...