Как я копирую последний файл от одного каталога до другого?

На 12 поле (то, которое вытягивает резервное копирование с сервера) использует эту команду вместо этого:

rsync -av  user@192.168.1.100::wwwroot  /home/young001/backup --password-file=/home/rsync.pass 

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

Rsync не копируют каталоги рекурсивно defaul, необходимо использовать -a или -r опция.

4
10.04.2015, 11:19
3 ответа

Запустите это:

cp -p "`ls -dtr1 /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/* | tail -1`" /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Backup1/

Здесь мы добавили -d опцию os ls, чтобы получить абсолютный путь.

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

Также, так как у вас есть пробелы в пути, нам нужно процитировать ls -dtr1 /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/* | tail -1, чтобы оболочка не делала разделения слов на выходе.

8
27.01.2020, 20:47

Это потому, что это зависит от того, где вы выполняете ваш cp. В вашем примере ls -tr1 /Users/Me/Whatever вернет только website3.zip. Если вы запустите ваш cp из /tmp, то он попытается найти файл /tmp/website3.zip.

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

$ ls -tr1d /Users/Me/Whatever
...
website3.zip

$ ls -tr1d /Users/Me/Whatever/*
...
/Users/Me/Whatever/website3.zip

Однако, будьте осторожны в случае, если последняя измененная запись является каталогом. В этом случае cp не скопирует его, если опустить опцию -R.

Если Ваши файлы всегда имеют расширение .zip, Вы можете учесть:

$ ls -tr1d /Users/Me/Whatever/*.zip

Вы также можете получить ошибку, если Ваша директория пуста. Почему бы вам не написать что-нибудь подобное:

#!/bin/bash

MY_DIR="/Users/Me/Documents/Coffi Work/FTP Backup Shell Script/Original/"
DEST="/Users/Me/Documents/Coffi Work/FTP Backup Shell Script/Backup1/"
FILEEXT="zip"

NEWEST=`ls -tr1d "${MY_DIR}/"*.${FILEEXT} 2>/dev/null | tail -1`

if [ -z "${NEWEST}" ] ; then
    echo "No file to copy"
    exit 1
elif [ -d "${NEWEST}" ] ; then
    echo "The most recent entry is a directory"
    exit 1
else
    echo "Copying ${NEWEST}"
    cp -p "${NEWEST}" "${DEST}"
fi
1
27.01.2020, 20:47

Как уже заметили другие, есть две проблемы с вашим подходом. Они не имеют ничего общего с файлами .zip vs .sh, а только с именами и местоположением файлов.

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

Более того, команда ls выводит только базовое имя файла, без части каталога. Поэтому cp видит только базовое имя и понятия не имеет, что вы имели в виду файлы в другом каталоге. Один из способов исправить это - сначала переключиться на нужный каталог.

cd /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/
cp -p "`ls -tr | tail -1`" ../Backup1/ 

Если вам нужен только последний zip-файл, а не последний файл, каким бы он ни был:

cd /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/
cp -p "`ls -dtr *.zip | tail -1`" ../Backup1/ 

Это не сработает со странным сообщением об ошибке, если каталог пуст или если есть имя файла, содержащее новые строки или символы, которые не могут быть распечатаны в текущей локали, но это относительно редкие обстоятельства.

Опция -d обеспечивает дополнительную безопасность в случае, если существует подкаталог, имя которого совпадает с *.zip. Опция -1 не нужна, ее действие происходит автоматически, когда выход ls перенаправляется на другую команду.

В качестве альтернативы вы можете использовать zsh, что делает это приятным и простым благодаря своим глобусным классификаторам .

cp -p /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/*(om[1]) /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Backup1/
2
27.01.2020, 20:47

Теги

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