Escrevendo o script de shell para listar os arquivos em todos os diretórios, exceto alguns

1

Eu quero listar os arquivos em cada diretório que o diretório contém sub-diretórios também, nos diretórios eu deveria ignorar alguns diretórios que podem ser o diretório pai ou sub-diretório. A partir do script abaixo eu consegui listar os arquivos apenas em um diretório e não em outros diretórios. por favor, deixe-me saber como posso resolver este problema.

Script que eu tentei

#!/bin/sh
find * -type d | while IFS= read d; do
    dirname='basename $d'
        if [ ${dirname} != "Decommissioned" ]; then
          cd $dirname
          find * ! -name . -prune -type f | while read fname; do
             fname='basename $fname'
             echo $fname
          done
        else
           continue
        fi
done
    
por absar 06.11.2017 / 05:04

2 respostas

1

Se você quiser listar todos os arquivos comuns, mas ignorar os que estão em diretórios chamados Decommissioned , faça o seguinte:

find . -name Decommissioned -type d -prune -o -type f -print

Se você quiser apenas o nome de base, com GNU find , você pode substituir o -print por -printf '%f\n' . Ou POSIXly:

find . -name Decommissioned -type d -prune -o -type f -exec sh -c '
  for file do;
    printf "%s\n" "${file##*/}"
  done' sh {} +

Ou se você puder garantir que nenhum dos nomes de arquivo contenha caracteres de nova linha:

find . -name Decommissioned -type d -prune -o -type f -print |
  awk -F / '{print $NF}'
    
por 06.11.2017 / 07:51
0

o código abaixo irá ignorar o diretório "Decommissioned" e listar os arquivos em outros diretórios.

find . -type d | while read DirName
do
   echo "${DirName}" | grep "Decommissioned" >/dev/null 2>&1
   if [ "$?" -ne "0" ]
   then
        find ${DirName} -type f | awk -F/ '{print $NF}'
   fi
done

Responder com base no comentário

bash-4.1$ find .
.
./c
./c/c.txt
./c/c2
./c/c2/c2.txt
./c/c1
./c/c1/c1.txt
./a
./a/a.txt
./a/a2
./a/a2/a2.txt
./a/a1
./a/a1/a1.txt
./b
./b/b2
./b/b2/b2.txt
./b/b1
./b/b1/b1.txt
./b/b.txt

bash-4.1$ find . | grep -vE "a/|b2" | grep "\.txt"
./c/c.txt
./c/c2/c2.txt
./c/c1/c1.txt
./b/b1/b1.txt
./b/b.txt
    
por 06.11.2017 / 05:10

Tags