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

Я пробовал все вышеперечисленное безрезультатно. Затем я попробовал щелчок правой кнопкой мыши по области фильтров USB и нашел пункт меню «Добавить фильтр с устройства». Вуаля! Это сработало.

1
задан 8 May 2017 в 18:46

6 ответов

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

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

#!/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
ответ дан 22 May 2018 в 22:48
  • 1
    Если место назначения не существует, файл не перемещается. Это намеренно? – wjandrea 8 May 2017 в 20:47
  • 2
    @wjandrea Да, есть ли у вас какое-то предложение? – Jsdude 8 May 2017 в 21:02
  • 3
    @Jsdude Это улучшение, но все же не идеальное: if [ -d "$DESTINATION/A-F" ] || mkdir -p "$DESTINATION/A-F"; then echo "Moving file..."; mv $file "$DESTINATION/A-F"; fi – wjandrea 9 May 2017 в 00:13

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

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

#!/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
ответ дан 18 July 2018 в 13:37

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

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

#!/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
ответ дан 24 July 2018 в 20:13

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

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
ответ дан 22 May 2018 в 22:48
  • 1
    Я предлагаю заменить ls -w1 "$SOURCE" | grep ^[m-r,M-R] | while read FILE на for file in "$source"/* и сделать все ваши имена переменных строчными, чтобы избежать перезаписи переменных среды. – wjandrea 9 May 2017 в 18:31
  • 2
    Просто чтобы сделать это немного более явным: если эта замена выполнена (и она, вероятно, имеет хотя бы одно преимущество: не зависит от стабильности выходного формата ls), то логика того, что следует за трубой, должна быть воспроизведена в цикл for. Что касается переменных, то переписывание любых гипотетических переменных среды имеет смысл только в процессе выполнения этого скрипта. Установленные переменные не сохраняются после завершения сценария. Они не распространяются в среду вне этого скрипта даже во время работы. Единственный способ понять, что это было бы важно, если бы. , , – Lew Rockwell Fan 9 May 2017 в 20:28
  • 3
    @wjandrea Единственный способ, который я могу видеть, имеет значение, если бы в сценарии использовались как гипотетические переменные среды, так и локально установленные переменные, что не так. Рекомендация может быть оправдана на основе «хорошей привычки». поскольку иногда могут возникать условия, в которых это имеет значение. Смещение - это перцептивная проблема. Мне нравятся переменные. Это облегчает чтение сценария для меня. Я иногда использую случай верблюда, который затрагивает обе проблемы. Пожалуйста, исправьте меня, если вы считаете, что я ошибаюсь в техническом аспекте этого. – Lew Rockwell Fan 9 May 2017 в 20:34

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

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
ответ дан 18 July 2018 в 13:37

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

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
ответ дан 24 July 2018 в 20:13
  • 1
    Я предлагаю заменить ls -w1 "$SOURCE" | grep ^[m-r,M-R] | while read FILE на for file in "$source"/* и сделать все ваши имена переменных строчными, чтобы избежать перезаписи переменных среды. – wjandrea 9 May 2017 в 18:31
  • 2
    Просто чтобы сделать это немного более явным: если эта замена выполнена (и она, вероятно, имеет хотя бы одно преимущество: не зависит от стабильности выходного формата ls), то логика того, что следует за трубой, должна быть воспроизведена в цикл for. Что касается переменных, то переписывание любых гипотетических переменных среды имеет смысл только в процессе выполнения этого скрипта. Установленные переменные не сохраняются после завершения сценария. Они не распространяются в среду вне этого скрипта даже во время работы. Единственный способ понять, что это было бы важно, если бы. , , – Lew Rockwell Fan 9 May 2017 в 20:28
  • 3
    @wjandrea Единственный способ, который я могу видеть, имеет значение, если бы в сценарии использовались как гипотетические переменные среды, так и локально установленные переменные, что не так. Рекомендация может быть оправдана на основе «хорошей привычки». поскольку иногда могут возникать условия, в которых это имеет значение. Смещение - это перцептивная проблема. Мне нравятся переменные. Это облегчает чтение сценария для меня. Я иногда использую случай верблюда, который затрагивает обе проблемы. Пожалуйста, исправьте меня, если вы считаете, что я ошибаюсь в техническом аспекте этого. – Lew Rockwell Fan 9 May 2017 в 20:34

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

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