Перемещение файлов из источника в место назначения по категориям [закрыто]

В настоящее время я изучаю сценарий bash и пытаюсь написать сценарий, который перемещает файлы из исходного каталога в целевой, классифицирует файлы по первой букве и создает подкаталог по первой букве.

Категории:

  • AF
  • GL
  • MR
  • SZ
  • #

Это то, что я написал до сих пор, и я не уверен, как действовать дальше:

move.sh

echo "Enter the source"
read SOURCE

echo "Enter the destination"
read DESTINATION

for file in $SOURCE;do
    case ${file:0:1} in
      {a..f} ) echo "Belongs to A-F";
        if [ -d $DESTINATION/A-F ]
        then mv file $DESTINATION/A-F
        else mkdir $DESTINATION/A-F
      {g..l} ) echo "Belongs to G-L";
        if [ -d $DESTINATION/G-L ]
        then mv file $DESTINATION/G-L
        else mkdir $DESTINATION/G-L
      {m..r} ) echo "Belongs to M-R";
        if [ -d $DESTINATION/M-R ]
        then mv file $DESTINATION/M-R
        else mkdir $DESTINATION/M-R
      {s..z} ) echo "Belongs to S-Z";
        if [ -d $DESTINATION/S-Z ]
        then mv file $DESTINATION/S-Z
        else mkdir $DESTINATION/S-Z
        { } ) echo "Belongs to #";
        if [ -d $DESTINATION/# ]
        then mv file $DESTINATION/#
        else mkdir $DESTINATION/#
    esac
exit 0

Пример:

Я загрузил файлы в каталог загрузок

aa1.jpg, gg2.mp3, zo1.mkv, 01010.pdf

sh move.sh 


Enter the source
/Downloads

Enter the destination
/Documents

После запуска скрипта я должен получить:

/Documents/#/01010.pdf
/Documents/A-F/aa1.jpg
/Documents/G-L/gg2.mp3
/Documents/S-Z/zo1.mkv
1
задан 8 May 2017 в 18:46

2 ответа

Я заметил некоторые ошибки в Вашем сценарии:

Это должно привести к результату, который Вы ищете:

#!/bin/bash

echo "Enter the source"
read SOURCE

echo "Enter the destination"
read DESTINATION

for file in $SOURCE/*; do
  base=`basename "${file}"`
  letter=${base:0:1}

  case $letter in
    [a-f]) echo "A-F";
     if [ -d "$DESTINATION/A-F" ]; then
       echo "Moving file..."
       mv $file "$DESTINATION/A-F"
     else
      mkdir -p "$DESTINATION/A-F";
     fi
    ;;
    [g-l]) echo "G-L"
      if [ -d "$DESTINATION/G-L" ]; then
        echo "Moving file..."
        mv $file "$DESTINATION/G-L"
      else
        mkdir -p "$DESTINATION/G-L"
      fi
    ;;
    [m-r]) echo "M-R"
      if [ -d "$DESTINATION/M-R" ]; then
        echo "Moving file..."
        mv $file "$DESTINATION/M-R"
      else
        mkdir -p "$DESTINATION/M-R"
      fi
    ;;
    [s-z]) echo "S-Z";
      if [ -d "$DESTINATION/S-Z" ]; then
        echo "Moving file..."
        mv $file "$DESTINATION/S-Z"
      else
        mkdir -p "$DESTINATION/S-Z";
      fi
    ;;
    *) echo "-"
      if [ -d "$DESTINATION/-" ]; then
        echo "Moving file..."
        mv $file "$DESTINATION/-"
      else
        mkdir -p "$DESTINATION/-";
      fi
  esac
done
1
ответ дан 7 December 2019 в 13:33

Я предлагаю делать каталоги прежде попытка переместить файлы, не после. Кроме того, пропустите проверку существование каталога, просто используйте

mkdir -p

, Также я не думаю, что Вам нужны все те сложные условные выражения, хотя простота находится в уме наблюдателя, я предполагаю. Мне что-то как следующее кажется более простым.

#!/bin/bash

# repeats until you enter a valid directory
while [ ! -d "$DESTINATION_ANY_VALID_FORM" ]; do
      read -p "Enter destination directory:" DESTINATION_ANY_VALID_FORM
done

# canonicalizes directory name into a standard form
DESTINATION="$(readlink -f "$DESTINATION_ANY_VALID_FORM")"

# same deal for source
while [ ! -d "$SOURCE_ANY_VALID_FORM" ]; do
      read -p "Enter source directory:" SOURCE_ANY_VALID_FORM
done

SOURCE="$(readlink -f "$SOURCE_ANY_VALID_FORM")"

# makes the directories you want if they don't exist already - 
# conditionals aren't needed.
mkdir -p $DESTINATION/A-F
mkdir -p $DESTINATION/G-L
mkdir -p $DESTINATION/M-R
mkdir -p $DESTINATION/S-Z
mkdir -p $DESTINATION/#

# And then move the files any way you want. There must eleventy-twelve ways. 
# I was wrong thinking wildcards would be easy. 
# That is actually kind of hard. 
# The following is easy to write and understand, but there are more efficient ways.

ls -w1 "$SOURCE" | grep ^[a-f,A-F] | while read FILE ; do
       mv --verbose --backup --target-directory="$DESTINATION/A-F" "$SOURCE/$FILE"  
done

ls -w1 "$SOURCE" | grep ^[g-l,G-L] | while read FILE ; do
       mv --verbose --backup --target-directory="$DESTINATION/G-L" "$SOURCE/$FILE"  
done

ls -w1 "$SOURCE" | grep ^[m-r,M-R] | while read FILE ; do
       mv --verbose --backup --target-directory="$DESTINATION/M-R" "$SOURCE/$FILE"
done

ls -w1 "$SOURCE" | grep ^[s-z,S-Z] | while read FILE ; do
       mv --verbose --backup --target-directory="$DESTINATION/S-Z" "$SOURCE/$FILE"
done

ls -w1 "$SOURCE" | grep ^[0-9] | while read FILE ; do
       mv --verbose --backup --target-directory="$DESTINATION/#" "$SOURCE/$FILE"
done

версия мусорного ведра вставки: https://paste.ubuntu.com/24540558 /

1
ответ дан 7 December 2019 в 13:33

Другие вопросы по тегам:

Похожие вопросы: