Iterar os arquivos no diretório, criar pastas com base em nomes de arquivos e mover arquivos para as respectivas pastas

0

Gostaria de mover os arquivos em um diretório para pastas com os mesmos nomes. Eu gostaria de fazer tudo isso usando a linha de comando ou um script bash

#!/bin/bash

for  f in $1; do
  mv "$f".* <not sure what do do>
done

Como posso pegar os nomes dos arquivos e criar as pastas?

    
por Michael James 25.10.2015 / 21:43

2 respostas

1

Responda em construção, por favor, seja paciente:)

Como isso funciona

Crie um arquivo chamado makeDirs.sh , copie o script abaixo no arquivo, salve e torne o script executável com chmod +x /path/to/makeDirs.sh

LEMBRE-SE DE TER BACKUPS ANTES DE EXECUTAR QUALQUER SCRIPT

Chame o script com o diretório no qual você deseja operar como argumento de linha de comando. Demonstração

Script

#!/bin/bash

OPERATINGDIR="$1"
mkdir "$OPERATINGDIR/TMP"

find "$OPERATINGDIR" -maxdepth 1 -type f  | while IFS= read  FILE
do

  printf " operating on $FILE. Moving to TMP dir\n"
  mv "$FILE" "$OPERATINGDIR/TMP" 

  FULLBASENAME="$(basename "$FILE" )"
  CROPPEDBASENAME="$( basename "$FILE" | awk -F'.' '{ for(i=1;i<NF;i++) printf $i FS }' )"

  printf "Cropped basename is %s\n Full basename %s\n" "$CROPPEDBASENAME" "$FULLBASENAME"

# test if we have basename-directory made
  [ -d "$OPERATINGDIR"/"$CROPPEDBASENAME"  ] || mkdir "$OPERATINGDIR"/"$CROPPEDBASENAME" && printf "created "$OPERATINGDIR"/"$CROPPEDBASENAME" "

  printf "Moving $FILE from TMP folder to "$OPERATINGDIR"/"$CROPPEDBASENAME" \n"
  mv "$OPERATINGDIR"/TMP/"$FULLBASENAME" "$OPERATINGDIR"/"$CROPPEDBASENAME"

printf "\n\n"
done
    
por Sergiy Kolodyazhnyy 25.10.2015 / 22:10
3

Pelo que entendi, você pretende fornecer um nome de diretório como o primeiro argumento do script de shell. Os arquivos nesse diretório devem ser movidos para subdiretórios desse diretório cujos nomes são os mesmos que os arquivos, mas com extensões omitidas. Nesse caso:

#!/bin/bash    
for f in "$1"/*
do
    [ -d "$f" ] && continue
    base=${f%.*}
    mkdir -p "$base"
    mv "$f" "$base/"
done

Como funciona:

  • [ -d "$f" ] && continue

    Para evitar a recursão, isso ignora os subdiretórios de $1 .

  • base=${f%.*}

    Isso atribui à variável de shell base o nome de $f com sua extensão removida. Este é um exemplo de remoção do sufixo .

  • mkdir -p "$base"

    Isso garante que o diretório $base exista.

  • mv "$f" "$base/"

    Isso move o arquivo para o diretório.

por John1024 25.10.2015 / 22:03