Existe um comando de uma linha para tornar o chmod interativo?

24

Estou procurando algo como:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

Ou sintaxe semelhante.

Você também pode trabalhar em outros comandos para os quais deseja confirmação individual.

    
por Harvey 23.01.2015 / 07:19

2 respostas

45

Isso faz o que você está procurando:

find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x

Isso usa find em vez de ls porque, geralmente, analisar ls da saída não é confiável . Este formulário, usando find , no entanto, funcionará com nomes de arquivos, mesmo que contenham novas linhas ou outros caracteres difíceis.

Explicação

  • find . -maxdepth 1 -type f -print0

    Isto seleciona os arquivos. Isso pode ser personalizado usando qualquer uma das muitas opções do find. A opção print0 informa find para imprimir os nomes de arquivos em uma lista separada por nulo. Este é o único confiável para transmitir listas de nomes de arquivos.

  • xargs -L1 -p0 chmod +x

    Isso leva a lista separada por núm de nomes de arquivos gerados por find e aplica seu comando a eles.

A opção -L1 informa xargs para trabalhar em apenas um nome de arquivo de cada vez. A opção -p informa xargs para solicitar aprovação antes de continuar. A opção -0 informa xargs para usar o caractere nulo como o delimitador entre os nomes dos arquivos.

[Eu desconhecia a opção -p para xargs até que @kwan a apontasse.]

    
por 23.01.2015 / 07:51
25

Você pode usar xargs .

por exemplo:

ls|xargs -I path -p chmod +x path

Opção -p : Solicita ao usuário que execute cada linha de comando e leia uma linha do terminal. Só execute a linha de comando se a resposta começar com 'y' ou 'Y'.

    
por 23.01.2015 / 07:43