Mover cada nome de arquivo para subpastas de nome de arquivo [duplicado]

0

Eu tenho uma estrutura de diretórios como esta

file 1.ext1
file 1.ext2
file 1.ext3
file 2.temp.ext1
file 2.ext2
file 3.ext1

Eu quero criar cada subpasta e mover cada nome de arquivo, independentemente de sua extensão

file 1\file 1.ext1
file 1\file 1.ext2
file 1\file 1.ext3
file 2\file 2.temp.ext1
file 2\file 2.ext2
file 3\file 3.ext1

alguma maneira fácil de fazer isso? obrigado

    
por TheOski 29.11.2014 / 06:38

2 respostas

2
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 . .
por Sparhawk 29.11.2014 / 06:55
0

isso será suficiente:

#!/bin/bash
#this script sorts files according to their extensions
oldIFS=$IFS
IFS=$'\n'
(find . -type f) > /tmp/temp
for var in 'cat /tmp/temp'
do
    name='basename "$var"'
    name='echo $name | cut -d'.' -f1'
    mkdir -p $name
    mv "$var" $name/ 2> /dev/null
done
IFS=$oldIFS
    
por Edward Torvalds 29.11.2014 / 06:44