Não de arquivos e diretórios em um diretório específico no shell script

0

Estou trabalhando no Linux e é novo para mim. Eu criei um script de shell countfiledirs . Eu quero saber o número de arquivos e diretórios em um diretório específico.

Meu código é:

#!/bin/bash
echo "total directories:" 'find . -type d | wc -l'

echo "total files:" 'find . -type f | wc -l'

Está a ser apresentado da seguinte forma quando executei este comando ./countfiledirs

total directories: 148
total files: 255 

Eu quero saber quantos diretórios e arquivos existem se eu usar este comando ./countfiledirs /usr/share .

    
por buddha sreekanth 04.05.2015 / 14:35

2 respostas

2

Arquivos e diretórios podem ter novas linhas em seus nomes, então você não pode "apenas" usar wc -l como você está fazendo.

Se você quiser um script que use um parâmetro e conte recursivamente arquivos e diretórios, use:

#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -printf \n | wc -l
echo -n 'total files:';  find "$1" -type f -printf \n | wc -l

E chame o script fornecendo o diretório como argumento de linha de comando:

./your_script_name /home/e_g_your_home_dir.

Embora, curto, o acima é de um para os diretórios (a menos que você considere um diretório para ser "em" em si), você também pode substituir wc -l com algo que pode lidar com "linhas" terminadas em NUL e use -print0

#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -print0 | python -c "import sys; print len(sys.stdin.read().split('
#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -printf \n | wc -l
echo -n 'total files:';  find "$1" -type f -printf \n | wc -l
'))-2" echo -n 'total files:'; find "$1" -type f -print0 | python -c "import sys; print len(sys.stdin.read().split('
./your_script_name /home/e_g_your_home_dir.
'))-1"

Se você não quiser fazer isso recursivamente (contando apenas os arquivos / diretórios no diretório especificado e não aqueles em um diretório que esteja no diretório especificado), adicione -maxdepth 1 após o% co_de parâmetro%.

    
por 04.05.2015 / 15:01
0

Você precisa aceitar o primeiro parâmetro da linha de comando, $1 . O ideal seria atribuir isso a uma variável, DIR="$1" . Se nada foi fornecido, então parece que você deseja usar como padrão o diretório atual . . Você pode fazer isso com test -z "$DIR" && DIR='.' ou, mais idiomaticamente, basta usar a variável e fornecer um valor padrão "${DIR:-.}" .

Juntando isso, você pode ter algo assim:

#!/bin/bash
DIR="$1"

echo "total directories: $(find "${DIR:-.}" -type d -ls | wc -l)"
echo "total files: $(find "${DIR:-.}" -type f -ls | wc -l)"

Por acaso, o código original que você postou (antes de eu editar sua pergunta) não poderia ter funcionado:

echo "total directories:" find . -type d | wc -l

Você precisaria colocar find . -type d | wc -l nos backticks '...' ou, melhor ainda, a construção $( ... ) . Eu usei a segunda abordagem aqui. Para situações simples, elas podem ser equivalentes, mas $( ... ) é geralmente mais robusto.

    
por 04.05.2015 / 14:43