2009-05-13 3 views
7

У меня есть каталог src /, который содержит много файлов .cc и его двоичный файл. Например:Как удалить/удалить исполняемые файлы (aka файлы без расширения) только

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 .... 

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

ответ

16

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

find . -perm +100 -type f -delete 
+3

Просто для ясности это проверяет, установлен ли бит exec пользователя, и использует устаревший синтаксис. Посмотрите, как люди находят детали. –

16

Здесь вы идете:

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

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

+4

@Richie: спасибо. Есть ли способ исключить «makefile»? Что мы хотим сохранить. – neversaint

+3

@foolishbrat: просто добавьте еще один grep: ls | grep -v "\." | grep -v makefile | xargs rm – RichieHindle

+0

Как об исключении подкаталогов? угадать, что вам нужно использовать 'find' вместо' ls' для этого? Кроме того, вы можете исключать файлы с '.' и' Makefile' с помощью одного 'grep', например:' ls | grep -v "\. \ | Makefile" ' – sixty4bit

8

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

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

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

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

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

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

+0

@Stephan: Я получил «find: -executable: unknown option» – neversaint

+0

Что вы используете? -executable не работает для меня. Тем не менее, я могу использовать -perm/ugo + x с GNU find. –

+0

@foolishbrat: возможно, вы используете более старый вариант поиска. Попробуйте ответить kcwu. – Stephan202

2

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

2

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

find . \! -name "*.*" -type f -exec rm {} \; 
+0

отсутствие. не означает, что он является исполняемым –

3
find . -perm /ugo+x -delete 

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

EDIT: Также попробуйте:

find . -perm /111 -delete 

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

+0

@Matt: под MacOsX я получаю это: find: -perm:/ugo + x: незаконная строка режима – neversaint

+0

Попробуйте восьмеричную версию. –

2

я предлагаю использовать первые

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

, чтобы увидеть название файлов, которые подбираются.

, а затем измените Ls -l гт

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

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

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

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

+0

И это безопаснее. Просто подумайте о том, что произойдет, если вы используете одно из других решений grep'ish, и кто-то решит, что было бы неплохо иметь файл «README» ;-) – lothar

+1

Как бы вы написали цель «make clean», чтобы удалить все скомпилированные исполняемые файлы? Я думал, что это был смысл 'find' и' ls | grep', чтобы поставить под 'clean:' и поймать все исполняемые файлы? Или я чего-то не хватает? – Harry

+0

Make-файлы сделаны из статических инструкций, описывающих карту, файлы источников которой используются для создания определенного целевого файла и того, как. Поэтому у вас обычно есть список всех возможных целевых исполняемых файлов в переменной TARGETS или аналогичной. – raimue

Смежные вопросы