Mover arquivos para diretórios, dependendo de sua extensão [duplicado]

4

Eu tenho um diretório com um grande número de arquivos com diferentes extensões. O que eu quero fazer é mover cada extensão para uma pasta com o nome da própria extensão, e os arquivos sem extensão são movidos para uma pasta chamada unkown .

Por exemplo, eu tenho os arquivos a.txt , b.txt , a.pdf , b.pdf , a.mp4 , file , newfile ....

O resultado seria 4 dirs denominadas txt , pdf , mp4 , unkonw

o txt dir contém os arquivos a.txt , b.txt

o pdf dir contém os arquivos a.pdf , b.pdf

o mp4 dir contém os arquivos a.mp4

o unkonw dir contém os arquivos file , newfile

    
por Maythux 30.05.2015 / 11:19

2 respostas

6

Aqui está outra maneira:

mkdir -p unknown; 
for f in *; do 
[[ $f =~ \. ]] && mkdir -p "${f##*.}" && 
               mv "$f" "${f##*.}"/ || 
mv "$f" unknown/; done

Explicação

  • && significa "executar o comando à direita apenas se o comando à esquerda for bem sucedido".
  • || significa "executar o comando à direita apenas se o comando à esquerda falhar". Os dois símbolos combinados podem funcionar como um bloco if/else .
  • mkdir -p unknown; : crie o diretório unknown . O -p está lá para que mkdir não reclame se o diretório existir.
  • for f in * : para todos os arquivos e diretórios no diretório atual.
  • [[ $f =~ \. ]] && : se o nome atual do arquivo / dir contiver um . , se ele tiver uma extensão, então ...
  • mkdir -p "${f##*.}"/ : a construção ${var##pat} removerá a correspondência mais longa de pat do início da variável $var . Aqui, o pat é qualquer coisa até um ponto, então isso deixará apenas a extensão. Este comando, portanto, cria o diretório da extensão, se não existir.
  • mv "$f" "${f##*.}"/ : O mv move o arquivo para o diretório relevante. || mv "$f" unknown/; : se o comando anterior falhou (se este arquivo / diretório) não tiver uma extensão, mova-o para unknown .

Observe que isso imprimirá essa mensagem de erro, mas você pode ignorá-la com segurança:

mv: cannot move ‘unknown’ to a subdirectory of itself, ‘unknown/unknown’

Se você precisar mover apenas arquivos e nenhum diretório (os comandos acima também moverão um diretório chamado dir.foo para foo/ ), use isso:

mkdir -p unknown; 
for f in *; do 
[[ -f $f ]] && 
    if [[ $f =~ \. ]]; then 
        mkdir -p "${f##*.}" && 
        mv "$f" "${f##*.}"/; 
    else mv "$f" unknown/; fi; 
done
    
por terdon 30.05.2015 / 13:48
5

Este script bash fará isso: execute com bash script.sh <path> ou ./script.sh <path> , onde <path> é o caminho para a pasta que contém os arquivos:

#!/bin/bash

for path in /*
do
    if [ -f "${path}" ]
    then
        extension="$(<<< "${file}" sed -rn 's/^.*\.(.*)$//p')"
        if [ -n "${extension}" ]
        then
            mkdir -p "/${extension}"
            mv "${path}" "/${extension}"
        else
            mkdir -p "/unknown"
            mv "${path}" "/unknown"
        fi
    fi
done

tree output antes e depois de executar o script em um diretório tmp :

ubuntu@ubuntu:~$ tree tmp
tmp
├── a.mp4
├── a.pdf
├── a.txt
├── b.pdf
├── b.txt
├── file
├── folder
└── newfile

1 directory, 7 files
ubuntu@ubuntu:~$ bash script tmp/
ubuntu@ubuntu:~$ tree tmp
tmp
├── folder
├── mp4
│   └── a.mp4
├── pdf
│   ├── a.pdf
│   └── b.pdf
├── txt
│   ├── a.txt
│   └── b.txt
└── unknown
    ├── file
    └── newfile

5 directories, 7 files
    
por kos 30.05.2015 / 11:57

Tags