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"
Если вы используете 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
Вот сценарий. Если вы назовёте его 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
Вы, вероятно, должны добавить некоторую валидацию (например, убедиться, что случайно пронумерованный файл ещё не существует) и тот факт, что пользователь предоставляет два аргумента.