Bem, um caminho é apenas uma string. Assim, você pode dividi-lo em /
e aplicar seu comando a cada resultado. Por exemplo, você pode usar um pequeno perl one-liner para imprimir os caminhos pai:
$ path=/path/to/some/deeply/buried/thing
$ echo "$path" | perl -F"/" -lane 'for(1..$#F){print join("/",@F[0..$_])}'
/path
/path/to
/path/to/some
/path/to/some/deeply
/path/to/some/deeply/buried
/path/to/some/deeply/buried/thing
Se você agora criar uma função desse comando perl (execute este comando ou adicione-o ao arquivo de inicialização do seu shell - ~/.bashrc
se você estiver usando bash
):
pexpand(){
printf '%s\n' "$1" | perl -F"/" -lane 'for(1..$#F){print join("/",@F[0..$_])}';
}
Agora, você pode usá-lo assim:
$ pexpand $path
/path
/path/to
/path/to/some
/path/to/some/deeply
/path/to/some/deeply/buried
/path/to/some/deeply/buried/thing
E você pode executar comandos em cada diretório desse caminho com:
chmod 733 "$(pexpand "$path")"
A abordagem acima falhará se o seu caminho puder conter novas linhas. Uma versão mais robusta é:
pexpand(){
perl -le '@F=split(/\//, $ARGV[0]);
for(1..$#F){printf "%spexpand "$path" | while IFS= read -r -d '' d; do chmod 733 "$d"; done
",join("/",@F[0..$_])}' "$1";
}
Isso é mais difícil de usar:
#!/usr/bin/perl
my $comm = $ARGV[0] || die "At least 2 arguments are necessary\n";
my $path = $ARGV[1] || die "At least 2 arguments are necessary\n";
my @paths=split(/\//, $path);
for (1..$#paths) {
system("$comm \"" . join("/",@paths[0..$_]) . "\"");
}
Portanto, se você precisar disso para trabalhar com entradas arbitrárias, eu recomendo escrever um pequeno script que use o caminho e o comando como entrada:
foo.pl "chmod 700" /path/to/some/deeply/buried/thing
Salve esse script como algo ( foo.pl
ou qualquer outro) em um diretório no seu $PATH
, torne-o executável ( chmod a+x ~/bin/foo.pl
) e agora você pode executá-lo assim:
$ path=/path/to/some/deeply/buried/thing
$ echo "$path" | perl -F"/" -lane 'for(1..$#F){print join("/",@F[0..$_])}'
/path
/path/to
/path/to/some
/path/to/some/deeply
/path/to/some/deeply/buried
/path/to/some/deeply/buried/thing