Не было никакого решения, которое позволило мне решать эту проблему из той системы с тем пользователем. Я не мог получить корневой доступ, и не было никакого приема для обхождения проблемы.
Я должен был угробить сервер и запуститься снова.
Это зависит от того, как Вы определяете, какие файлы должны быть установлены как исполняемые файлы. Например, если рассматривают все файлы, которые не имеют точки в имени файла, можно использовать:
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
в этом случае отключить рекурсивный поиск.
Вы могли сделать что-то как:
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");
}
Просто передайте путь к каталогу, который будет исследован. Запустите скрипт без любого аргумента для обработки текущего рабочего каталога.
sudo
команда, которая используется для получения полномочий пользователя root. Пока Вы работаете chmod
на файлах, принадлежавших пользователю, Вы зарегистрированы как, Вы не должны использовать sudo
.
– Krzysztof Adamski
04.10.2012, 19:10
.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
(рекурсивно убывающий в подкаталоги).
Это также, вероятно, работало бы
chmod +x $(find . -type f -print0 | xargs -0 file | grep "ELF [^,;]* executable" | cut -d: -f1)
У Вас все еще будут проблемы, если Ваши файлы будут иметь пробелы, вкладки, новые строки, звездочки, вопросительные знаки, угловую скобку или символы обратной косой черты на имена, или если существуют слишком многие из них для помещений в одну командную строку.