Как сделать исполняемый файл всех файлов, исключая несколько типов файлов?

Не было никакого решения, которое позволило мне решать эту проблему из той системы с тем пользователем. Я не мог получить корневой доступ, и не было никакого приема для обхождения проблемы.

Я должен был угробить сервер и запуститься снова.

4
04.10.2012, 20:09
4 ответа

Это зависит от того, как Вы определяете, какие файлы должны быть установлены как исполняемые файлы. Например, если рассматривают все файлы, которые не имеют точки в имени файла, можно использовать:

find -type f -not -name "*.*" -exec chmod +x \{\} \;

Это найдет рекурсивно все файлы (не каталоги), которые не имеют точки в имени файла и устанавливают их исполняемый файл. Если Вы хотите ограничить это только текущим каталогом, добавить -maxdepth 1 аргумент, как это:

find -maxdepth 1 -type f -not -name "*.*" -exec chmod +x \{\} \;

Вы могли также полагаться file команда, которая могла сказать Вам, если файл является исполняемым файлом ELF. Чтобы сделать это, Вы могли выполнить что-то как:

find -type f -exec /bin/sh -c "file {} | grep -q executable && chmod +x {}" \;

Это рекурсивно найдет все регулярные файлы и вызов file команда на них. Затем grep будет искать "исполняемую" строку в выводе этой команды (это должно быть что-то как ELF 32-bit LSB executable ...) и только если это находит его, chmod будет назван на этом файле.

Конечно, можно также добавить -maxdepth 1 в этом случае отключить рекурсивный поиск.

12
27.01.2020, 20:45

Вы могли сделать что-то как:

find /pathtostuff -type f ! -name "*.c" -exec chmod +x {} +

Это заглядывает /pathtostuff для файлов то отсутствие a .c расширение и добавляет выполнить полномочия к ним.

ОБНОВЛЕНИЕ

Это может быть расширено для обработки других расширений C также:

find . -type f ! -name "*.c" ! -name "*.h" ! -name "*.cc" ! -name "*.cpp" -exec chmod +x {} +

АЛЬТЕРНАТИВНЫЙ ПОДХОД

Этот сценарий является дополнительным агностиком. Это ищет файлы, которые являются "двоичными" в противоположность "тексту".

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
my @dir = @ARGV ? @ARGV : ('.');
my @files;
find( sub { -f $_ && !-T $_ && push @files, $File::Find::name }, @dir );
for my $file (@files) {
    system("echo  +x $file");
}

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

4
27.01.2020, 20:45
  • 1
    , я удивлен! Это не сделало попросивший пароля. –  Santosh Kumar 04.10.2012, 18:42
  • 2
    Что, если я хочу исключить другое расширение? Сказать .cc. –  Santosh Kumar 04.10.2012, 18:42
  • 3
    Это не действительно идеально, так как может быть .o/.h/.cpp и другие файлы. –  Krzysztof Adamski 04.10.2012, 18:45
  • 4
    @SantoshKumar: этому не нужен пароль ни для чего. Пароль только необходим, когда Вы используете sudo команда, которая используется для получения полномочий пользователя root. Пока Вы работаете chmod на файлах, принадлежавших пользователю, Вы зарегистрированы как, Вы не должны использовать sudo. –  Krzysztof Adamski 04.10.2012, 19:10
  • 5
    @JRFerguson: Я не хочу быть раздражающим со своими комментариями, но могут быть некоторые двоичные файлы, которые не являются исполняемым файлом в каталоге. Например, .o файлы. Также рассмотрите, как жемчуг определяет, является ли файл двоичным или текстовым файлом - он читает блок файла, и проверьте, сколько "нечетные" символы (controlcodes, метасимволы) там. Если это - больше чем 10% таких символов или если существует по крайней мере один нулевой символ в этом блоке, это рассмотрело двоичный файл. Это может привести к некоторым неправильным результатам. В целом нет никакого хорошего способа сказать, является ли это двоичный или текстовый файл. –  Krzysztof Adamski 04.10.2012, 22:45

В zsh:

setopt extendedglob
chmod +x -- ^*.c

С ksh или ударом с extglob опция или zsh с kshglob опция:

chmod +x -- !(*.c)

С ksh93 (вероятно, лучше всего, чтобы не играть с FIGNORE, хотя):

FIGNORE='@(.*|*.c)'
chmod +x -- *

Для всех, замены *.c с *.* исключить что-либо, что имеет точку.

С zsh можно сделать хорошие вещи с globbing спецификаторами, как:

oftype() [[ $(file -b --mime-type -- $REPLY) = $type ]]
type=application/x-executable; chmod +x -- **/*(.+oftype)

Который соответствовал бы на регулярных файлах "oftype" application/x-executable (рекурсивно убывающий в подкаталоги).

3
27.01.2020, 20:45

Это также, вероятно, работало бы

chmod +x $(find . -type f -print0 | xargs -0 file | grep "ELF [^,;]* executable" |  cut -d: -f1)

У Вас все еще будут проблемы, если Ваши файлы будут иметь пробелы, вкладки, новые строки, звездочки, вопросительные знаки, угловую скобку или символы обратной косой черты на имена, или если существуют слишком многие из них для помещений в одну командную строку.

1
27.01.2020, 20:45
  • 1
    Это, кажется, 64-разрядное конкретный. –  Krzysztof Adamski 04.10.2012, 18:46

Теги

Похожие вопросы