Команда cp не создает каталог в сценарии sh \ bash, почему?

Я новичок в сценарии sh / bash, и у меня возникла следующая проблема:

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

В моем скрипте есть следующие строки кода:

# Creazione Nuovo Pacchetto per Ubuntu
JRE_I386="jre1.6.0_35-i386"
JRE_AMD64="jre1.6.0_35-x86_64"

ApplicationName="XCloud"

# Se il primo parametro è una stringa vuota mostra il messaggio di errore ed esce:
if [ -z $1 ]; then
    echo "Usage: createpkg.sh <rev package>"
    exit

# Altrimenti setta la variabile CURRENT_VERSION con il valore del parametro di input passato:
else
    CURRENT_VERSION=$1      
fi

echo ---------------------------------------------------------------------------------------------------
echo ---------------------------------------------------------------------------------------------------
echo 
echo CREAZIONE NUOVO PACCHETTO ${ApplicationName}${CURRENT_VERSION}
echo 
echo ---------------------------------------------------------------------------------------------------
echo ---------------------------------------------------------------------------------------------------

# Verifica esistenza ambiente prima di generare la nuova versione. Se esiste torna ERRORE:
if [ -e "${ApplicationName}${CURRENT_VERSION}ubuntu1-i386" ]; then
    echo "Errore: la cartella contenente la nuova versione da creare gia' esiste"
    exit
fi
if [ -e "${ApplicationName}${CURRENT_VERSION}ubuntu1-amd64" ]; then
    echo "Errore: la cartella contenente la nuova versione da creare gia' esiste"
    exit
fi

# Copia dell' alberatura completa (recursive and force), copia PACKAGE nella destinazione:
cp -Rf PACKAGE ${ApplicationName}${CURRENT_VERSION}ubuntu1-i386
cp -Rf PACKAGE ${ApplicationName}${CURRENT_VERSION}ubuntu1-amd64
echo "Copia dell' alberatura completata"

# Copia della JRE corretta:
cp -Rf ../JRE/${JRE_I386} ${ApplicationName}${CURRENT_VERSION}ubuntu1-i386/usr/share/${ApplicationName}/jre1.6.0_35
cp -Rf ../JRE/${JRE_AMD64} ${ApplicationName}${CURRENT_VERSION}ubuntu1-amd64/usr/share/${ApplicationName}/jre1.6.0_35
echo "Copia della JRE corretta completata"
......................................................................................
......................................................................................
SOME OTHER STUFF
......................................................................................
......................................................................................

Проблема возникает с двумя последними командами cp, потому что при попытке выполнить эти строки:

cp -Rf ../JRE/${JRE_I386} ${ApplicationName}${CURRENT_VERSION}ubuntu1-i386/usr/share/${ApplicationName}/jre1.6.0_35
cp -Rf ../JRE/${JRE_AMD64} ${ApplicationName}${CURRENT_VERSION}ubuntu1-amd64/usr/share/${ApplicationName}/jre1.6.0_35

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

Фактически, мой вывод в оболочке следующий:

cp: impossibile creare la directory "XCloud1ubuntu1-i386/usr/share/XCloud/jre1.6.0_35": File o directory non esistente
cp: impossibile creare la directory "XCloud1ubuntu1-amd64/usr/share/XCloud/jre1.6.0_35": File o directory non esistente

В чем проблема? Что я делаю неправильно?

Tnx

Андреа


person AndreaNobili    schedule 22.10.2013    source источник
comment
Вы пытались сделать то же самое cp в терминале, шаг за шагом, чтобы восстановить проблему? Может быть, в пути есть опечатки или у вас нет нужных прав ?!   -  person EverythingRightPlace    schedule 22.10.2013
comment
Посмотрите здесь: stackoverflow.com/questions/1529946/   -  person Refael    schedule 23.10.2013


Ответы (4)


Вам нужно создать каталоги перед копированием в них, посмотрите команду mkdir

person izissise    schedule 22.10.2013

Попробуйте добавить

mkdir -p ${ApplicationName}${CURRENT_VERSION}ubuntu1-i386/usr/share/${ApplicationName}/jre1.6.0_35

а также

mkdir -p ${ApplicationName}${CURRENT_VERSION}ubuntu1-amd64/usr/share/${ApplicationName}/jre1.6.0_35

непосредственно перед двумя строками cp.

person damienfrancois    schedule 22.10.2013
comment
ммм таким образом, похоже, не создает проблемы, но теперь у меня есть еще одно сомнение, почему с двумя предыдущими командами cp не создается такая же ошибка, также id у меня нет этих каталогов? Я имею в виду две команды: cp -Rf PACKAGE $ {ApplicationName} $ {CURRENT_VERSION} ubuntu1-i386 cp -Rf PACKAGE $ {ApplicationName} $ {CURRENT_VERSION} ubuntu1-amd64 echo Copia dell 'alberatura completetata - person AndreaNobili; 22.10.2013
comment
Добавьте флаг -v (подробный) к первому cp, чтобы проверить, что происходит. Возможно, скопированная структурированная информация не такая, как вы думаете, а может, где-то осталась опечатка. cp -Rfv source destination - person damienfrancois; 22.10.2013

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

Linux: скопируйте и создайте целевой каталог, если он есть не существует

Проверить, существует ли директорт, можно так:

if [ -d ~/directorypath ]; then
   echo "exist!"
else
   mkdir ~/directorypath
fi

вы можете сделать это в одной строке кода:

if [ ! -d ~/directorypath ]; then mkdir ~/directorypath; fi
person Refael    schedule 23.10.2013
comment
test -d ~/directorypath || mkdir ~/directorypath или просто mkdir -p ~/directorypath - person aragaer; 23.10.2013
comment
mkdir -p ~ / dir1 / dir2 / dir3 # для создания 3 каталогов. - person Refael; 23.10.2013

Сначала создайте каталог для заданного пути

mkdir /home/test

затем скопируйте файл из места назначения в источник

cp /home.a.txt /home/test
person Ashish Singhal    schedule 12.08.2014