Estou tentando obter o conteúdo de um diretório usando o shell script.
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 poderia usar for entry in *
, mas isso só funcionaria para o meu diretório atual.
Sei que posso mudar para esse diretório, usar e for entry in *
depois voltar, mas minha situação particular me impede de fazer isso.
Eu tenho dois caminhos relativos $search_dir
e $work_dir
, e eu 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.
bash
shell
directory-listing
jrharshath
fonte
fonte
for entry in "$search_dir/*"
que não funciona? Por que precisamos colocar/*
fora das aspas?find
seria mais rápido?for entry in "${search_dir}/*"
As outras respostas aqui são ótimas e respondem à sua pergunta, mas este é o principal resultado do google para "bash get list of files in directory" (que eu estava procurando salvar uma lista de arquivos), então pensei em publicar um responda a esse problema:
Se você deseja apenas um determinado tipo (por exemplo, arquivos .txt):
Observe que $ search_path é opcional; ls> filename.txt fará o diretório atual.
fonte
ls
para analisar nomes de arquivos? Nunca ouvi falar disso antes.Esta é uma maneira de fazer isso onde a sintaxe é mais simples para eu entender:
./
é o diretório de trabalho atual, mas pode ser substituído por qualquer caminho que*.txt
retorna algo.txt.Você pode verificar o que será listado facilmente digitando o
ls
comando diretamente no terminal.Basicamente, você cria uma variável que
yourfilenames
contém tudo o que o comando list retorna como um elemento separado e, em seguida, passa por ela. O loop cria uma variável temporáriaeachfile
que contém um único elemento da variável pela qual está fazendo loop, nesse caso, um nome de arquivo. Isso não é necessariamente melhor que as outras respostas, mas acho intuitivo porque já estou familiarizado com ols
comando e a sintaxe do loop for.fonte
A
,B
eC
. Você cria arquivos chamadosB\nC
eD
, em seguida, optar por excluí-los. Software que não lidar com esse direito pode acabar excluindo preexistente arquivos B e C, em vez mesmo se você não tem permissão para fazer isso.)fonte
fonte
xargs -0 -i echo "{}"
comando, quer me explicar um pouco? Em particular, o que a-i echo "{}"
peça faz? Também li naman
página que-i
está obsoleta agora e devemos usar-I
insted.-i
substitui{}
com o arg.{}
é a string que é substituída pelas correspondências pelofind
comando.xargs
? por padrão,find
imprime o que encontra ... você pode excluir tudo-print0
.Variações
Notas:
.
: pasta atual-maxdepth 1
para pesquisar recursivamente-type f
: encontre arquivos, não diretórios (d
)-not -path '*/\.*'
: não retorne.hidden_files
sed 's/^\.\///g'
: remova o anexo./
da lista de resultadosfonte
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).
echo *
Produz todos os arquivos do diretório atual. Ofor
loop itera sobre cada nome de arquivo e é impresso em stdout.Além disso, se estiver procurando por diretórios dentro do diretório, coloque-o dentro do
for
loop:test -d
verifica se o arquivo é um diretório.fonte
A resposta aceita não retornará o prefixo dos arquivos com a. Para fazer isso, use
fonte
Na versão Linux, eu trabalho com (x86_64 GNU / Linux) os seguintes trabalhos:
fonte
$search_dir
significa que ele quebra se houver um espaço no nome do diretório. (Neste caso, você pode começar afastado com não citar$entry
, mas que seria melhor prática para citá-lo.)mkdir "x y"; touch "x y/1.txt"; search_dir="x y"; for entry in $search_dir/*; do echo $entry; done
. O loop é executado duas vezes, uma vez na impressãox
e na segunday/*
, o que presumivelmente não é o resultado esperado.search_dir="x y"; for entry in $search_dir/*; do if [ -d "$entry" ]; then rm -rf "$entry"; fi; done
. Se também houver umx
diretório no diretório atual, ele será excluído sumariamente, apenas porque você não citou sua variável!Basta digitar este comando simples:
fonte