Скопируйте файл и добавьте метку времени

13

У меня есть две проблемы с моим сценарием, который копирует файлы и добавляет метку времени к имени.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

Вышеуказанное добавляет в Test2качестве имени файла имя, но я хочу, чтобы оно сохранило имя файла исходного исходного файла, которое в этом примере называется Test.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

Другая проблема, когда я добавляю в %rкачестве кода метки времени, я получаю сообщение об ошибке, указывающее, что целевой «PM» не является каталогом. Я пытаюсь получить метку времени как 12-часовое время.

Брайан
источник
Добавление AM / PM добавляет дополнительное место в имени файла. Если вы настаиваете на этом, попробуйте что-то вроде: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (дата +% m-% d-% y-% r)"
Ромео Нинов
2
Илиdate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

Ответы:

12

Одна из ваших проблем заключается в том, что вы исключили двойные кавычки вокруг подстановки команд, поэтому выходные данные dateкоманды были разделены пробелами. См. Почему мой сценарий оболочки задыхается от пробелов или других специальных символов? Это действительная команда:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

Если вы хотите добавить к исходному имени файла, вы должны иметь это в переменной.

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Если вы используете bash, вы можете вместо этого использовать расширение скобки.

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

Если вы хотите скопировать файл в другой каталог и добавить метку времени к исходному имени файла, вы можете сделать это следующим образом - ${source##*/} расширить до значения sourceбез части до последнего /(удаляет самый длинный префикс, соответствующий шаблону). */):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Если Test1это каталог, он копируется рекурсивно, и файлы внутри каталога сохраняют свое имя: только к каталогу верхнего уровня добавляется метка времени (например Test1/foo, копируется в Test1-05-10-15-07:19:42 PM). Если вы хотите добавить метку времени ко всем именам файлов, это другая проблема.

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

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"
Жиль "ТАК - прекрати быть злым"
источник
Жиль, первая команда не сработает ИМХО, проверяйте позиции двойных кавычек. И смотри мой комментарий к вопросу
Ромео Нинов
@RomeoNinov Что не так с первой командой? Вы запустили его и получили ошибку?
Жиль "ТАК - перестань быть злым"
Вы правы, дата команды выполнена в подоболочке
Ромео Нинов
Жиль, используя приведенный выше пример, как мне скопировать файл с вышеуказанной информацией о временной метке в другой каталог. Следующая команда не работает:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Брайан
@ Брайан Я не уверен, что понял ваш комментарий, но посмотрите мои изменения.
Жиль "ТАК - перестань быть злым"