Mover arquivos para pastas usando o script bash

1

Eu tenho vários arquivos como Apple-AP01 , Apple-AP02 , Banana-AP05 , Chocolate-RS33 e outros em meu diretório pessoal que são extraídos de um servidor ftp. No mesmo diretório home há Pastas como Fruit , Sweet , etc. E nessas pastas, há subpastas com nomes como Apple-AP01 , Apple-AP02 , Chocolate-RS33 , etc.

Eu preciso executar um script no meu diretório inicial, assim que eu tiver Apple-AP01 , ele sabe colocá-lo na pasta Fruta com base na palavra-chave " AP " e depois colocar isso na Apple-AP01 pasta. e para Chocolate-RS33 , ele precisa ir para a pasta Sweet com base na palavra-chave " RS " e depois na subpasta Chocolate-RS33 dentro da pasta Sweet . Eu preciso disso para todos os meus arquivos. Alguém pode colocar um script bash que funcionaria?

Eu tentei

for f in *.
do
    name='echo "$f"|sed 's/ -.*//''
    letter='echo "$name"|cut -c1'
    dir="DestinationDirectory/$letter/$name"
    mkdir -p "$dir"
    mv "$f" "$dir"
done

Acho que preciso usar um for loop, mas não sei como fazer isso no bash.

    
por ksuzy31 01.11.2017 / 19:13

2 respostas

0

Verifique, faça o que você quer.

Primeira maneira:

#!/bin/bash

declare -A arr_map

arr_map=([AP]=Fruit [RS]=Sweet)

# Iterate through indexes of array
for keyword in "${!arr_map[@]}"; do
    # Search files containing the "-$keyword" pattern in the name
    # like "-RS" or "-AP". This pattern can be tuned to the better matching.
    for filename in *-"$keyword"*; do
        # if file exists and it is regular file
        if [ -f "$filename" ]; then
            destination=${arr_map["$keyword"]}/"$filename"
            # Remove these echo commands, after checking resulting commands.
            echo mkdir -p "$destination"
            echo mv -iv "$filename" "$destination"
        fi  
    done
done

Segunda via:

#!/bin/bash

declare -A arr_map

arr_map=([AP]=Fruit [RS]=Sweet)

# Iterate through all files at once
for i in *; do
    # If the file is a regular and its name conforms to the pattern
    if [[ -f "$i" && "$i" =~ [A-Za-z]+-[A-Z]+[0-9]+ ]]; then
        # trim all characters before the dash: '-' from the beginning
        keyword=${i#*-}
        # trim all digits from the ending
        keyword=${keyword%%[0-9]*}

        # if the arr_map contains this keyword
        if [[  ${arr_map["$keyword"]} != "" ]]; then
            destination=${arr_map["$keyword"]}/$i
            # Remove these echo commands, after checking resulting commands.
            echo mkdir -p "$destination"
            echo mv -iv "$i" "$destination"
        fi
    fi
done
    
por 02.11.2017 / 01:47
2

Isso deve cobrir a maior parte do que você quer fazer.

sortfood.sh

#!/bin/bash


# Puts files into subdirectories named after themselves in a directory.

# add more loops for more ID-criteria

for f in *AP*; do
    mkdir -p "./fruit/$f";
    mv -vn "$f" "./fruit/$f/";
done

for f in *RS*; do
    mkdir -p "./sweet/$f";
    mv -vn "$f" "./sweet/$f/";
done
    
por 01.11.2017 / 23:07