bash - Como obter a lista de arquivos em um diretório em um script de shell?




directory-listing (6)

A resposta aceita não retornará o prefixo de arquivos com a. Para fazer isso, use

for entry in "$search_dir"/* "$search_dir"/.[!.]* "$search_dir"/..?*
do
  echo "$entry"
done

Eu estou tentando obter o conteúdo de um diretório usando o script de shell.

Meu script é:

for entry in `ls $search_dir`; do
    echo $entry
done

onde $search_dir é um caminho relativo. No entanto, $search_dir contém muitos arquivos com espaços em branco em seus nomes. Nesse caso, esse script não é executado conforme o esperado.

Eu sei que eu poderia usar for entry in * , mas isso só funcionaria para o meu diretório atual.

Eu sei que posso mudar para esse diretório, usar for entry in * depois mudar de volta, mas minha situação específica me impede de fazer isso.

Eu tenho dois caminhos relativos $search_dir e $work_dir , e tenho que trabalhar em ambos simultaneamente, lendo-os criando / excluindo arquivos neles, etc.

Então, o que eu faço agora?

PS: Eu uso bash.


Aqui está outra maneira de listar arquivos dentro de um diretório (usando uma ferramenta diferente, não tão eficiente quanto algumas das outras respostas).

cd "search_dir"
for [ z in `echo *` ]; do
    echo "$z"
done

echo * Gera todos os arquivos do diretório atual. O loop for itera sobre cada nome de arquivo e imprime para stdout.

Além disso, se estiver procurando por diretórios dentro do diretório, coloque-o dentro do loop for :

if [ test -d $z ]; then
    echo "$z is a directory"
fi

test -d verifica se o arquivo é um diretório.


Esta é uma maneira de fazer isso onde a sintaxe é mais simples para eu entender:

yourfilenames=`ls ./*.txt`
for eachfile in $yourfilenames
do
   echo $eachfile
done

./ é o diretório de trabalho atual, mas pode ser substituído por qualquer caminho
*.txt retorna qualquer *.txt
Você pode verificar o que será listado facilmente digitando o comando ls diretamente no terminal.

Basicamente, você cria uma variável yourfilenames contendo tudo o que o comando list retorna como um elemento separado e, em seguida, faz um loop através dele. O loop cria uma variável temporária eachfile que contém um único elemento da variável que está passando por loop, neste caso, um nome de arquivo. Isso não é necessariamente melhor que as outras respostas, mas acho intuitivo porque já estou familiarizado com o comando ls e com a sintaxe do loop for.


Na versão do Linux eu trabalho com (x86_64 GNU / Linux) os seguintes trabalhos:

for entry in "$search_dir"/*
do
  echo "$entry"
done

for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done

$ pwd; ls -l
/home/victoria/test
total 12
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  a
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  c
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'c d'
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  d
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_a
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'e; f'

$ find . -type f
./c
./b
./a
./d
./c d
./e; f

$ find . -type f | sed 's/^\.\///g' | sort
a
b
c
c d
d
e; f

$ find . -type f | sed 's/^\.\///g' | sort > tmp

$ cat tmp
a
b
c
c d
d
e; f

Variações

$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

Notas:

  • . : pasta atual
  • remove -maxdepth 1 para pesquisar recursivamente
  • -type f : procura arquivos, não diretórios ( d )
  • .hidden_files -not -path '*/\.*' : não retorna .hidden_files
  • sed 's/^\.\///g' : remova o prepended ./ da lista de resultados






directory-listing