como alterar permissões de tipo de arquivo específico

2
 file * |  grep 'ASCII text' | chmod -x 
chmod: missing operand
Try 'chmod --help' for more information.

O comando acima me dá erro. Basicamente eu estou tentando encontrar todos os arquivos cujo tipo é ASCII e mude suas permissões para -x.Que erro existe na sintaxe acima?

    
por Registered User 08.03.2011 / 11:50

4 respostas

3

Um: grep 'ASCII text' retorna não apenas o nome do arquivo, mas também o tipo do arquivo em si; você precisa processar a saída para retornar somente o nome do arquivo

Dois: chmod não aceita argumentos de STDIN, que é o que você está tentando fazer com o canal | . Você terá que usar xargs ou agrupar o acima em um for loop

Dito isto, aqui estão duas soluções para você:

Solução # 1: com os tubos

file * | awk '/ASCII text/ {gsub(/:/,"",$1); print $1}' | xargs chmod -x

Solução # 2: com loop for

for fn in $(file * | awk '/ASCII text/ {gsub(/:/,"",$1); print $1}'); do chmod -x "$fn"; done

Escolha seu veneno: -)

    
por 08.03.2011 / 12:00
2

Isso deve funcionar independentemente de os nomes dos arquivos conterem espaços ou pontos-e-vírgulas:

find -maxdepth 1 -type f -exec sh -c 'file -b "{}" | grep -sq ASCII' \; -print0 | xargs -0 chmod -x

Você pode remover o -maxdepth 1 para torná-lo recursivo.

Pode haver falsos positivos se os próprios nomes de arquivo contiverem a string "ASCII".

Editar:

Incorporei a sugestão de pepoluan de usar a opção -b para file , para que o nome do arquivo não seja enviado para o teste por grep . Isso deve eliminar falsos positivos.

    
por 08.03.2011 / 12:23
1
for f in 'file * | grep "ASCII text" | awk "{print \$1}" | awk -F ":" "{print \$1}"'; do chmod -x "$f"; done
    
por 08.03.2011 / 11:54
1

E mais um liner - esteja ciente da necessidade de remover o : ASCII Text e citar também os nomes

file * | grep 'ASCII text' | sed  's|\(^.*\):.*|\"\"|'| xargs chmod -x
    
por 08.03.2011 / 12:16