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.

Também pode funcionar em outros comandos para os quais você deseja confirmação individual.

Harvey
fonte

Respostas:

45

Isso faz o que você está procurando:

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

Isso usa findmais do que lsporque, geralmente, a análise da lssaída não é confiável . Este formulário, findno entanto, funcionará com nomes de arquivos, mesmo que contenham novas linhas ou outros caracteres difíceis.

Explicação

  • find . -maxdepth 1 -type f -print0

    Isso seleciona os arquivos. Isso pode ser personalizado usando qualquer uma das muitas opções de localização. A opção print0informa findpara imprimir os nomes dos arquivos em uma lista separada por nulos. Este é o único confiável para transmitir listas de nomes de arquivos.

  • xargs -L1 -p0 chmod +x

    Isso pega a lista separada por nulos de nomes de arquivos gerados finde aplica seu comando a eles.

A -L1opção diz xargspara trabalhar apenas em um nome de arquivo por vez. A -popção informa xargspara solicitar a aprovação antes de continuar. A -0opção informa xargspara usar o caractere nulo como delimitador entre os nomes de arquivo.

[Eu desconhecia a -popção xargsaté que @kwan apontou.]

John1024
fonte
Você pode tornar o findcomando POSIX compatível usando -exec printf '%s\0' {} +. Não pense que há alguma maneira de tornar tudo compatível com o POSIX.
L0b0
Esta sintaxe me dá um aviso find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.Assim, ele funciona com o -maxdepth 1antes do -type f, como: find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x.
Harvey
@ Harvey Você está correto: atualizei a resposta para remover esse aviso.
precisa saber é o seguinte
25

Você pode usar xargs.

por exemplo:

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

Opção -p: Avisa o usuário sobre a execução de cada linha de comando e a leitura de uma linha no terminal. Somente execute a linha de comando se a resposta começar com 'y' ou 'Y'.

Kwan
fonte
1
+1 Gosto tanto do seu uso xargs -pque vou copiá-lo.
precisa saber é o seguinte
1
Perfeito! E maneira muito simples de tornar mais qualquer comando interativo. Obrigado.
Harvey
21
Não analise ls.
Kroltan 23/01
@Kroltan - por que alguém usaria uma nova linha em um nome de arquivo?
Nbubis
1
@nbubis Isso pode acontecer: vá para um terminal e digite touch "a very long file namee pressione enter. Veja a continuação da linha e simplesmente digite a cotação de fechamento e pressione enter novamente. tadaa, nova linha no nome do arquivo. Por preguiça de redigitar um nome de arquivo longo.
Kroltan