몇 가지 파일 형식을 제외한 모든 파일을 실행 가능하게 만드는 방법은 무엇입니까?

몇 가지 파일 형식을 제외한 모든 파일을 실행 가능하게 만드는 방법은 무엇입니까?

많은 C 소스 파일과 동일한 수의 컴파일 출력 파일이 포함된 폴더가 있습니다.

이 모든 파일에 대해 실행 가능 비트가 설정되어 있었지만 어떤 이유로 누락되어 실행할 수 없게 되었습니다.(얼마전에 폴더를 NTFS 파티션으로 옮겼기 때문인 것 같습니다.).

해당 파일(내 디렉터리의 다른 파일은 제외)을 다시 실행 가능하게 만들고 싶습니다. 한 가지 가능한 방법은 이 폴더의 모든 소스 파일을 임시 폴더로 이동하고 다음을 수행하는 것입니다.

chmod +x *

그런 다음 소스 파일을 현재 폴더로 다시 이동합니다.

파일을 이동하지 않고도 동일한 작업을 수행할 수 있습니까?

노트:

컴파일된 출력 파일에 확장자가 없습니다.(C에서).

답변1

어떤 파일을 실행 가능하게 만들 것인지 정의하는 방법에 따라 다릅니다. 예를 들어 파일 이름에 점이 없는 모든 파일을 고려하는 경우 다음을 사용할 수 있습니다.

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이 경우 재귀 검색 비활성화를 추가할 수도 있습니다.

답변2

다음을 수행할 수 있습니다.

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

/pathtostuff그러면 다음 파일이 검색됩니다 .부족실행 권한을 확장 .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");
}

확인하려면 디렉터리 경로를 전달하면 됩니다. 현재 작업 디렉터리를 처리하려면 매개변수 없이 스크립트를 실행하세요.

답변3

zsh에서:

setopt extendedglob
chmod +x -- ^*.c

extglob옵션과 함께 ksh 또는 bash를 사용 하거나 옵션과 함께 zsh를 사용하십시오 kshglob.

chmod +x -- !(*.c)

ksh93 사용(FIGNORE를 피하는 것이 가장 좋음):

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

모든 항목에 대해 점이 있는 항목을 제외하려면 ~ *.c로 바꾸세요.*.*

zsh를 사용하면 다음과 같은 전역 한정자를 사용하여 몇 가지 좋은 작업을 수행할 수 있습니다.

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

이는 "oftype"(하위 디렉터리로 반복적으로 내림차순) 일반 파일과 일치합니다 application/x-executable.

답변4

이것도 효과가 있을 수 있습니다

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

파일 이름에 공백, 탭, 줄 바꿈, 별표, 물음표, 꺾쇠 괄호 또는 백슬래시 문자가 포함되어 있거나 단일 명령줄에 들어갈 수 없을 정도로 많은 경우 여전히 문제가 있습니다.

관련 정보