Encontra e entra nesse diretório?

3

Eu quero fazer alguma tarefa em todos os diretórios no caminho atual, então eu tentei

for DIRECTORY in 'find . -type d -maxdepth 1'
do
    cd $DIRECTORY

    #DO STUFF

    cd ..
done

mas recebi um longo erro de tal arquivo.

updateall.sh: line 5: cd: ./abc No such file or directory

Por quê? Eu tentei cd ./abc e estava tudo bem.

obrigado

    
por yumyai 11.01.2012 / 07:46

2 respostas

4

Você precisa adicionar -mindepth 1 . Caso contrário você cd .. sairá do diretório base original na primeira repetição do loop e terminará em seu diretório pai.

É fácil perceber quando você executa a expressão find :

$ find . -type d -maxdepth 1
.
./abc

No primeiro loop, você cd . , que não faz nada e, em seguida, cd .. , a partir do qual não é possível inserir todos os outros diretórios encontrados.

Se não houver problema com espaços em nomes de diretório, você sempre poderá usar find $PWD em vez de find . para usar caminhos absolutos ou armazenar o $PWD original em uma variável à qual você pode cd ( $OLDPWD e cd - provavelmente não funcionará), em vez de cd .. .

    
por 11.01.2012 / 08:43
1

Você pode considerar o uso de -execdir, se estiver usando o gnu-find. É semelhante a -exec, mas executará o comando no diretório. (Pode ser um script ad hoc, se ele preencher várias linhas, por exemplo).

find . -type d -maxdepth 1 -mindepth 1 -execdir dostuff ";" 

Usando

for DIRECTORY in 'find ...'

é vulnerável a espaços em branco e coisas semelhantes em nomes de diretórios.

Exemplo:

mkdir "a a"
echo "123" > a 

for f in $(find . -mindepth 1 -type d); do echo "using $f"; ls -l $f ; done 
using ./a
-rw-r--r-- 1 stefan stefan 4 2012-01-13 08:15 ./a
using a
-rw-r--r-- 1 stefan stefan 4 2012-01-13 08:15 a
    
por 13.01.2012 / 08:18

Tags