Atravessa todos os subdiretórios e faz algo no shell script do Unix

9

Eu quero que meu script de shell visite todos os subdiretórios em um diretório principal. Faça algo nos diretórios, envie a saída para um arquivo de spool e vá para o próximo diretório. Considerar Dir principal = / tmp Subdir = A B C D (Quatro subdiretórios)

    
por Ashish 27.02.2015 / 11:22

5 respostas

0

Eu tenho a solução. O comando de localização abaixo atende aos meus requisitos.

find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep 'date +"%m%d%Y"'|xargs echo" \;
    
por 10.03.2015 / 16:05
13

Use um loop for :

for d in $(find /path/to/dir -maxdepth 1 -type d)
do
  #Do something, the directory is accessible with $d:
  echo $d
done >output_file

Ele procura apenas os subdiretórios do diretório /path/to/dir . Observe que o exemplo simples acima falhará se os nomes dos diretórios contiverem espaços em branco ou caracteres especiais. Uma abordagem mais segura é:

find /tmp -maxdepth 1 -type d -print0 |
  while IFS= read -rd '' dir; do echo "$dir"; done

Ou em bash :

for d in /path/to/dir/*; do
  if [ -d "$d" ]; then
    echo "$d"
  fi
done

(observe que, ao contrário de find , também se considera links simbólicos para diretórios e exclui os ocultos)

    
por 27.02.2015 / 11:47
1

Eu sou um completo bash newbie, mas um veterano da UN * X. Embora, sem dúvida, isso possa ser feito no shell script do Bash, antigamente usamos find [-maxdepth <levels>] <start-dir> -exec <command> ; para conseguir isso. Você poderia fazer um man find e brincar, talvez até alguém lhe dizer como fazer isso em bash !

    
por 27.02.2015 / 11:29
1

Parece que você deseja os nomes dos arquivos em cada um dos subdiretórios; o ls -l | awk não é robusto o suficiente, e se esses nomes de arquivo contiverem espaços em branco e / ou novas linhas? O find abaixo funcionaria mesmo para find s que, por acaso, não têm o -maxdepth :

find . ! -name . -type d -prune -exec sh -c '
   cd "$1" && \
   find "." ! -name . -prune  -type f
' {} {} \;
    
por 12.03.2017 / 09:55
0

Também é possível usar ls, grep e tr

for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done

ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done

du / sed também pode ser usado como um seletor se o seu ls não tiver as opções acima

du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'

Pode ser importante observar que esses exemplos retornam diretórios ocultos e excluem diretórios pais e atuais

    
por 03.11.2017 / 18:41