obtém os primeiros caracteres do parâmetro de expansão do comando find

1

Eu tenho uma enorme coleção de imagens e gostaria de colocá-las em pastas que correspondam à sua primeira extensão 3 charachers + .jpg.

Então, eu gostaria de pegar o arquivo 4_1_0002.png (todos os arquivos que começam com 4_1) e colocá-lo na pasta 4_1_.jpg . Da mesma forma, gostaria de pegar o arquivo 4_2_0002.png (todos os arquivos que começam com 4_2) e colocá-lo na pasta 4_2_.jpg .

Todos esses arquivos que eu gostaria de classificar estão agora em uma pasta enorme. Eu esperava usar um comando find, mas não sei como extrair os três primeiros caracteres do {} parâmetro de expansão.

find . -type f -ok echo mv {} "path/first3char.jpg" \;

    
por sanjihan 01.04.2017 / 10:32

2 respostas

2

src="/pathto/large_folder"
dest="/tmp/3chars"

mkdir -p "$dest" || exit 1

cd "$src" && \
find . -type f -name '???*' -exec sh -c '
   for f
   do
      b=${f##*/}
      d=${b%"${b#???}"}_.jpg
      [ -d "$dest/$d" ] || mkdir -p "$dest/$d"
      mv "$f" "$dest/$d/."
   done
' x {} +
    
por 01.04.2017 / 11:15
1

Existem ferramentas que facilitam muito a renomeação de arquivos. Por exemplo, usando qualquer uma das implementações do Perl rename , geralmente disponível sob o nome prename :

prename '$dir = substr($_,0,3); mkdir $dir; $_ = "$dir/$_"' *.jpg

Se os diretórios já existirem, você pode simplificar isso para

prename 's!(...)!$1/$1!' *.jpg

Se a sua distribuição não transportar prename , instale um, por exemplo, Unicode :: Tussle ou < a href="https://metacpan.org/pod/File::Rename"> Arquivo :: Renomear .

find provavelmente não é útil aqui, pois os arquivos estão todos no mesmo diretório. No entanto, você pode encontrar um erro porque a linha de comando é muito longa. find é uma maneira de resolver isso; você pode usar

find -maxdepth 1 -name '*.jpg' -exec prename 's!(...)!$1/$1!' {} +

Alternativamente, execute zsh ao invés de bash, e aproveite o seu zmv function .

autoload zmv        # you can put this in ~/.zshrc
mkdir_mv () {
  mkdir -p -- $2:h
  mv -- $1 $2
}
zmv -p mkdir_mv '(???)*.jpg' '$1/$f'

Se os diretórios já existem, você pode usar apenas

zmv '(???)*.jpg' '$1/$f'
    
por 01.04.2017 / 16:49