find . -type f -exec sh -c 'base=$(echo $1 | grep -oP "(?<=\./).*(?=\.[^\.]*$)"); mkdir -p "${base}"; mv "$1" "$base"' . {} \;
Explicação
-
find . -type fEste 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,grepda 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..