Удаление всех исполняемых файлов в каталоге в Linux

Прежде чем я рекурсивно tar каталог, я хочу иметь возможность удалить все исполняемые файлы. В Windows я бы просто удалил все файлы с расширениями.exe. И я не могу просто удалить все файлы в режиме исполнения, так как это также приведет к удалению сценариев оболочки. Так есть ли способ автоматически удалять только файлы сценариев сценариев без оболочки в каталоге?

8 ответов

Я полагаю, вы имеете в виду двоичные файлы? Если количество исполняемых файлов очень велико, эта команда может завершиться ошибкой из-за слишком длинной командной строки для "file" и "echo". Быстрый пример:

find /bin -type f | xargs file | grep "ELF.*executable" | awk -F: '{print $1}' | xargs echo

Если вы замените "echo" на "rm" в приведенном выше примере, эти файлы будут удалены. Команда "grep" должна предотвращать удаление библиотек (вы можете проверить на / lib).

(Обратите внимание, что сейчас у меня есть доступ только к FreeBSD, поэтому вывод команды linux "file" может отличаться, что приведет к изменению того, что вам нужно сделать.)

Это должно дать вам простой шаблон, как это сделать. Вам просто нужно быть уверенным, что вы знаете, что искать в выводе, заданном "file", и соответственно grep.

Быть осторожен. Вы можете полностью прервать свою систему, если вы запустите это как root в неправильном каталоге.

find . -perm /111 -type f -exec echo rm -v {} \;

Волшебство здесь в том, что флаг -perm (для разрешений) может принимать / предшествующий аргументу разрешения, что заставляет его искать логическое ИЛИ в каждом из битов. Со страницы руководства:

   -perm /mode
          Any  of the permission bits mode are set for the file.  Symbolic
          modes are accepted in this form.  You must specify 'u',  'g'  or
          'o'  if  you  use a symbolic mode.  See the EXAMPLES section for
          some illustrative examples.  If no permission bits in  mode  are
          set,  this  test  currently  matches no files.  However, it will
          soon be changed to match any file (the idea is to be  more  con-
          sistent with the behaviour of perm -000).

В случае, если это неясно, / указывает 111 указывает x в пользовательском ИЛИ x в группе ИЛИ x в других. И это не XOR, поэтому мы ищем по крайней мере один, но до 3.

Так как права доступа к файлу Unix

rwxrwxrwx
421421421

И мы заботимся о битах х, мы получаем маску

--1--1--1

или 111

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

РЕДАКТИРОВАТЬ

ОК, это также уничтожает все сценарии оболочки. Из-за относительно примитивного сопоставления регулярных выражений, я не нашел ни одного замечательного способа сделать это с помощью find. Я могу найти все.sh файлы, которые вы хотите, используя регулярные выражения:

   -regex ".*\(.*sh\$\)"

Но я не могу инвертировать это вообще. Так что я сдаюсь. Я все еще оставляю это здесь, на случай, если это кому-нибудь пригодится.

Напишите сценарий оболочки, или воспользуйтесь чужим предложением, или, если вы действительно хотите, просто временно удалите разрешения для исполняемых файлов сценариев оболочки, удалите все исполняемые файлы, а затем добавьте +x обратно. Удачи.

file * | grep executable | grep -v 'shell script' | cut -d: -f 1 | xargs rm

Или возможно:

make clean

;-)

Тебе нужно find перебирать файлы в дереве, file утилита командной строки для определения их типа файла, а затем perl для фильтрации исполняемых файлов:

find . -type f -print0 | xargs -0 file -N0 -- \
| perl -nlwe '/(.*\0).*ELF.*executable/ and printf $1' | xargs -0 ls -l --

Вы действительно хотите удалить файлы заменить финал ls -l -- с rm --,

Примечание: все -print0 а также -0 Переключатели необходимы, чтобы убедиться, что пробелы в именах файлов обрабатываются правильно. Это также причина, почему perl используется вместо awk, который не может действительно глотать нулевые символы на входе. -- Ключи предназначены для защиты от имен файлов, начинающих тире.

Прежде чем я рекурсивно tar каталог, я хочу иметь возможность удалить все исполняемые файлы.

ИМХО, короткий ответ таков: нет 100% надежного способа сделать это. В зависимости от разрешений одни могут пропустить или включить вещи, которые вам не нужны. В зависимости от имени файла не будет работать. Даже в зависимости от вывода команды file, вероятно, не очень хорошая идея, я видел, как она несколько раз пропускала вещи.

Используя биты из ответа Мэтта, я придумал это:

find . -perm /111 -type f -print0 | xargs -0 file | grep -v 'shell script' | cut -d: -f1 | xargs echo rm

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

Я создал скрипт bash, чтобы сделать это. Если вы изучите все строки в нем, я уверен, что вы сможете понять, как сделать все из командной строки и изменить его, чтобы удалить любой тип файла, то есть использовать "find -iname" или что-то еще.

#!/bin/bash
#this script will grab all executable files in the
#bash shell scripts ending in .sh will be saved
#current directory and delete them 
#it will also destroy itself so keep a copy somewhere

echo "WARNING! This script will self-destruct and take all"
echo "executable files in the current directory when executed"
echo ""
#first create a new file to set up executable files 
touch xdelgo.txt

#save all the bash shell scripts ending in .sh
#this will only work and in the pwd and not child directories
touch protected.sh
echo "#!/bin/bash" >> protected.sh
find . -type f | grep .sh | grep -v xdel.sh >> protect.txt
SAVE=$'\n';x=sudo;for l in $(<protect.txt);do echo -e "$x chmod u-x $l";  
((x+1));done >> protected.sh 

sudo chmod u+x protected.sh
./protected.sh

#throw all executable files from the current directory inside
find -type f -executable >> xdelgo.txt
echo "The following files have been marked for deletion"
echo " "
cat xdelgo.txt
echo " "

#create a new script that will execute deletion
touch xdelgo.sh
echo "#!/bin/bash" >> xdelgo.sh
echo "rm xdelgo.sh" >> xdelgo.sh
echo "rm xdelgo.txt" >> xdelgo.sh
echo "rm protect.txt" >> xdelgo.sh

#append rm to each line and throw into new executable file
DEL=$'\n';x=rm;for l in $(<xdelgo.txt);do echo -e "$x\t$l";((x+1));done   
>> xdelgo.sh

#go give permission to the file
sudo chmod u+x xdelgo.sh

echo "bash scripts ending in .sh have been protected"
echo "run ./restore.sh to re-enable .sh files"
echo ""
touch restore.sh
echo "#!/bin/bash" >> restore.sh
find . | grep .sh | grep -v xdel.sh >> restore.txt  
SAVE=$'\n';x=sudo;for l in $(<restore.txt);do echo -e "$x chmod u+x $l";  
((x+1));done >> restore.sh

sudo chmod u+x restore.sh
echo "rm restore.txt" >> restore.sh
echo "rm restore.sh" >> restore.sh
echo "rm protected.sh" >> restore.sh

#THE POINT OF NO RETURN
echo "Are you sure you really wanna delete these files?"
echo "Press ENTER to continue, ctrl+c to abort" 
read input
./xdelgo.sh
Другие вопросы по тегам