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.
fonte
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.
Isso faz o que você está procurando:
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
Isso usa find
mais do que ls
porque, geralmente, a análise da ls
saída não é confiável . Este formulário, 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
Isso seleciona os arquivos. Isso pode ser personalizado usando qualquer uma das muitas opções de localização. A opção print0
informa find
para 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 find
e aplica seu comando a eles.
A -L1
opção diz xargs
para trabalhar apenas em um nome de arquivo por vez. A -p
opção informa xargs
para solicitar a aprovação antes de continuar. A -0
opção informa xargs
para usar o caractere nulo como delimitador entre os nomes de arquivo.
[Eu desconhecia a -p
opção xargs
até que @kwan apontou.]
find
comando POSIX compatível usando-exec printf '%s\0' {} +
. Não pense que há alguma maneira de tornar tudo compatível com o POSIX.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 1
antes do-type f
, como:find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
.Você pode usar
xargs
.por exemplo:
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'.fonte
xargs -p
que vou copiá-lo.ls
.touch "a very long file name
e 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.