Não analise programaticamente a saída de ls
.
A saída de ls
é projetada para consumo humano, não programático. Existem várias maneiras pelas quais a análise direta pode ser interrompida, mais ou menos sutilmente. Apenas como exemplo, se eu executar o comando que você deu, eu recebo uma saída diferente:
$ mkdir -p newdir/folder0{1,2,3}
$ cd newdir
$ ls -1ad */
folder01//
folder02//
folder03//
$
Vê aquelas barras duplas? Isso porque eu tenho um alias ls
para ls --color=auto -F
.
É melhor usar uma ferramenta projetada ou que possa pelo menos ser bem colocada em serviço para o trabalho. Sugiro recorrer a find
.
$ mkdir -p newdir/folder0{1,2,3}
$ cd newdir
$ find . -mindepth 1 -maxdepth 1 -type d -printf './process_folder.sh sample/"%P"/\n'
./process_folder.sh sample/"folder03"/
./process_folder.sh sample/"folder01"/
./process_folder.sh sample/"folder02"/
$
-mindepth 1 -maxdepth 1
limita a pesquisa apenas aos diretórios iniciais fornecidos (somente .
neste caso) e exclui o próprio diretório inicial. -type d
limita as correspondências apenas aos diretórios. -printf
é uma ação que a find pode executar, que imprime metadados sobre a entrada do diretório encontrada em um determinado formato; %P
no formato string é substituído pelo nome da entrada encontrada menos o diretório inicial. Veja man 1 find
para mais detalhes.
Se você deseja criar um script para execução posterior, redirecione a saída de find
para um arquivo:
$ find . -mindepth 1 -maxdepth 1 -type d -printf './process_folder.sh sample/"%P"/\n' > process_folders.sh
Se você deseja um único comando que executa os comandos imediatamente, canalize a saída find
para um shell:
$ find . -mindepth 1 -maxdepth 1 -type d -printf './process_folder.sh sample/"%P"/\n' | bash
É muito menos provável que isso ocorra e fornece o que você deseja, sem recorrer à reescrita sofisticada da saída de um comando. Como está, suspeito que a única coisa que pode resolver isso é se os nomes de diretório tiverem aspas duplas.
-mindepth 1
era um truque necessário.-mindepth 1
(ou com o padrão-mindepth 0
especificado explicitamente),find
também imprime o diretório inicial, o que obviamente não é o que você deseja..sh
arquivo.-printf './process_folder.sh sample/"%P"/\n'
por-printf 'printf "%%s\\n" "%P"; ./process_folder.sh sample/"%P"/\n'
algo assim. Fazer isso imprimirá o nome de cada diretório à medida que é processado. (Sim, o dobro de% e \ são intencionais e necessários.)Você quer um loop:
fonte
Você pode tentar o seguinte comando:
Isso localiza os diretórios em perguntas e executa a pasta process_folder em cada um deles ao mesmo tempo: um único comando em vez de dois. Além disso, é imune a analisar problemas.
fonte