Estou escrevendo um script para me ajudar a manter meus arquivos organizados. Essencialmente, gostaria que o script organizasse meus arquivos com base em sua extensão. A solução atual examina tudo em um determinado diretório. Isso é um problema porque as pastas com pontos em seus nomes são movidas.
Eu queria saber se existe um if statement
que pode ser usado para verificar se o diretório é um diretório real ou não. Se for realmente um diretório, o script não deve movê-lo.
Aqui está a parte do código. Estou usando um for loop
para percorrer os arquivos, isso é baseado em um script em lote antigo que eu tinha no Windows, então esse pode não ser o melhor caminho a seguir. Por favor, deixe-me saber se há uma solução melhor:
#!/bin/bash
for i in *.*; do
filename=$(basename -- "$i")
extension="${filename##*.}"
extension="$extension"files
mkdir -p "$extension"
mv "$i" "$extension"
done
Eu pessoalmente usaria um
find
e umwhile
loop, pois você pode especificar o tipo de arquivo-type d/f
para diretório/arquivo, respectivamentecomo um "one liner" do diretório em que você executará isso:
Ou em um script:
explicação
find .
- encontra arquivos e diretórios do diretório atual-maxdepth 1
- verifica apenas o diretório atual (2 verificaria os diretórios do próximo nível também)-type f
- corresponde apenas a arquivos-name *.*
- qualquer arquivo com um "." no nomeTambém alterei a extensão para
.files
uma declaração de variável, pois suponho que é isso que você deseja. Se você quiser dizertmp.txt
estar em um diretório chamadotmp.txtfiles
(como em seu script atualmente), basta remover o "." igual a:EDITAR:
Então, como @Kusalananda apontou, fazer um loop sobre a
find
pode ser uma má ideia. Dito isto, você ainda pode usarfind
para isso, apenas usando um arquivo temporário para fazer o loop:Vou propor dois outros métodos; um do comentário de Kusalananda e outro de outra concha.
Primeiro, o bash (e outros shells) tem um operador simples
test
para ver se algo é um diretório:[ -d something ]
; você poderia usar assim:O acima verificaria cada "arquivo" do
*.*
curinga para ver se é um diretório; se for, o teste passa e o loop continua com o próximo item (se houver).Alternativamente, você pode usar o zsh, que possui amplos recursos curinga, um dos quais é limitar as correspondências a certos tipos de arquivos (arquivos regulares, diretórios, etc). Você poderia usá-lo como:
A sintaxe especial de
(.)
é um "qualificador glob" ; os parênteses indicam que é um qualificador, e o ponto indica que estamos procurando por arquivos simples. O resultado é que ofor
loop corresponderá apenas a arquivos - nunca a diretórios.Você pode usar
-f
em umaif
declaração para verificar se é um arquivo:-d
pode ser usado para determinar se é um diretório e!
pode ser prefixado para inverter a lógica, ou seja, verificar se a variável não é um arquivo: