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




directory-listing (8)

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.

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.


As outras respostas aqui são ótimas e respondem a sua pergunta, mas este é o resultado top do google para "bash obter lista de arquivos no diretório", (que eu estava procurando para salvar uma lista de arquivos) então eu pensei em postar um responder a esse problema:

ls $search_path > filename.txt

Se você quiser apenas um determinado tipo (por exemplo, qualquer arquivo .txt):

ls $search_path | grep *.txt > filename.txt

Note que $ search_path é opcional; ls> filename.txt fará o diretório atual.


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

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

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

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

find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"

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

$ 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