Ao usar glob
s, você deve remover as aspas. Caso contrário, o glob
s não será expandido.
Então:
for i in a/*
Em um diretório chamado a
, há muitas subpastas onde quero fazer algo. O mesmo para todos. Eu faço o seguinte, mas se aplica apenas ao primeiro subdiretório:
for i in "a/*"
do
#echo $i
cd $i
mkdir test
mv *_no test
touch aaa
cd ..
done
O código acima eu quero ser executado em todos os diretórios em a
.
O primeiro cd
chdirs no primeiro diretório (dois níveis de subdiretórios). E depois disso você não pode cd
no segundo porque você só retornou um nível para não voltar de onde começou. Mas, mesmo assim, você está circulando sobre um único valor: "a /*".
Como você colocou aspas em torno disso, ele não está sendo expandido.
No entanto, você esqueceu de colocar aspas em torno de $i
, de modo que ele é expandido nesse ponto como argumentos para cd
.
Existem muitos outros problemas com o seu código.
Algumas sugestões de melhorias:
for i in a/*/; do
(
cd -- "$i" &&
mkdir -p test || exit
mv -- *_no test
touch aaa
)
done
As citações de $ i dentro do loop não fazem nada, pois a/*/
já está expandido em palavras. Por exemplo, se a/*/
for expandido para um / Meus documentos /, no primeiro loop $i = a/My
e segundo loop $i = Documents/
Experimente
find . -maxdepth 1 -type d | while read i; do
(
cd -- "$i" &&
mkdir -p test || exit
mv -- *_no test
touch aaa
)
done