перемещение (файл | каталог) при предотвращении конфликтов имени файла

GNU coreutils только поддерживал даты ISO 8601, как введено начиная с версии 8.13 (выпущенный 08.09.2011). Необходимо использовать более старую версию.

Под более старыми версиями необходимо заменить T пространством. Иначе это интерпретируется как американский военный часовой пояс.

Даже под последними версиями, только полностью акцентированная форма распознана, не основной формат только с цифрами и a T в середине.

# Given a possibly abbreviated ISO date $iso_date...
date_part=${iso_date%%T*}
if [ "$date_part" != "$iso_date" ]; then
  time_part=${abbreviated_iso_date#*T}
  case ${iso_date#*T} in
    [!0-9]*) :;;
    [0-9]|[0-9][0-9]) time_part=${time_part}:00;;
    *)
      hour=${time_part%${time_part#??}}
      minute=${time_part%${time_part#????}}; minute=${minute#??}
      time_part=${hour}:${minute}:${time_part#????};;
  esac
else
  time_part=
fi
date -d "$date_part $time_part"

2
21.08.2018, 06:11
2 ответа

Если вы используете GNU mv , у вас есть следующий вариант.

$ mv -b source/* dest/.

Этот переключатель указывает mv отправлять любые файлы, которые конфликтуют в dest /. в резервную копию версии, обычно добавляя тильду ( ~ ) в конец файла перед перемещением файлов в каталог.

Пример

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

$ mkdir source dest
$ touch source/file{1..3} dest/file{1..5}

$ tree
.
├── dest
│   ├── file1
│   ├── file2
│   ├── file3
│   ├── file4
│   └── file5
└── source
    ├── file1
    ├── file2
    └── file3

Теперь, когда мы перемещаем файлы из источника в dest :

$ mv -b source/* dest/.
$ tree 
.
├── dest
│   ├── file1
│   ├── file1~
│   ├── file2
│   ├── file2~
│   ├── file3
│   ├── file3~
│   ├── file4
│   └── file5
└── source

2 directories, 8 files

Управление расширением

Снова с версией GNU mv вы можете изменить поведение по умолчанию с использованием переключателя -S <строка> .

$ mv -b -S "string" source/* dest/.

Пример

$ mv -b -S .old source/* dest/.

$ tree 
.
├── dest
│   ├── file1
│   ├── file1.old
│   ├── file2
│   ├── file2.old
│   ├── file3
│   ├── file3.old
│   ├── file4
│   └── file5
└── source

2 directories, 8 files
5
27.01.2020, 21:57

Вот сценарий. Если вы назовёте его move, то вам придётся использовать команду move file destination

#!/bin/bash

FILE=$1
DEST=$2

if `ls ${DEST}/${FILE} > /dev/null`
then
    base=`echo ${FILE} | sed 's/\(.*\)\..*/\1/'`
    ext=`echo ${FILE} | sed 's/.*\.\(.*\)/\1'`
    r=$RANDOM
    mv ${FILE} ${DEST}/${base}-${r}.${ext}
else
    mv ${FILE} ${DEST}
fi

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

0
27.01.2020, 21:57

Теги

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