find . -type f -exec sh -c 'base=$(echo $1 | grep -oP "(?<=\./).*(?=\.[^\.]*$)"); mkdir -p "${base}"; mv "$1" "$base"' . {} \;
Explicação
-
find . -type f
Este script funcionará em todos os arquivos "regulares" (ou seja, não funcionará no diretório atual.
). -
-exec sh -c '...' . {} \;
execute a parte'...
', com o nome do arquivo alimentado para o script como um argumento (e acessado por$1
). -
base=$(echo $1 | grep -oP "(?<=\./).*(?=\.[^\.]*$)");
deriva a parte base do nome do arquivo. ou seja,grep
da peça após./
e antes do final.
. -
mkdir -p "${base}";
Crie o diretório (por exemplo,file1
). -
mv "$1" "$base"
Mova o arquivo para o diretório recém-criado.
Se preferir que arquivos como file1.temp.ext1
sejam movidos para o diretório file1
, em vez de file1.temp
, você poderá usar o seguinte em seu lugar.
find . -type f -exec sh -c 'base=$(echo $1 | grep -oP "(?<=\./)[^\.]*(?=\..*$)"); mkdir -p "${base}"; mv "$1" "$base"' . {} \;
Explicação
-
(?<=\./)[^\.]*(?=\..*$)
A única parte que difere é a expressão regular para capturar a parte "base" do nome do arquivo, onde o novo diretório será criado. Isso agora captura até o primeiro.
, em vez do último.
.