Eu pessoalmente colocaria um loop find
e while
, já que você pode especificar o tipo de arquivo com -type d/f
para o diretório / arquivo, respectivamente
como "um forro" do diretório em que você executará:
find . -maxdepth 1 -type f -name "*.*" | while IFS="" read -r line; do filename=$(basename -- "$line"); extension="${filename##.}.files"; mkdir -p "$extension"; mv "$line" "$extension"; done
Ou em um script:
#!/bin/bash
find . -maxdepth 1 -type f -name "*.*" |
while IFS="" read -r line; do
filename=$(basename -- "$line")
extension="${filename##.}.files"
mkdir -p "$extension"
mv "$line" "$extension"
done
explicação
find .
- localiza arquivos e diretórios do diretório atual
-maxdepth 1
- apenas verifica o diretório atual (2 também verifica o próximo nível)
-type f
- corresponde apenas a arquivos
-name *.*
- qualquer arquivo com um "." no nome
Eu também alterei a extensão para .files
em uma declaração de variável, pois presumo que seja o que você deseja. Se você quiser que tmp.txt
esteja em um diretório chamado tmp.txtfiles
(como em seu script atualmente), basta remover o "." assim:
extension="${filename##.}files"
EDITAR:
Então, como @Kusalananda apontou, repetir um find
pode ser uma má ideia. Dito isto, você ainda pode usar find
para isso, apenas usando um arquivo temporário para fazer o loop:
#!/bin/bash
find . -maxdepth 1 -type f -name "*.*" > myTemporaryFile
IFS=$'\n' # in case any filenames have spaces in them
for line in $(cat myTemporaryFile); do
filename=$(basename -- "$line")
extension="${filename##.}.files"
mkdir -p "$extension"
mv "$line" "$extension"
done
rm myTemporaryFile