2015-04-27 11 views
1

Я написал короткий CSH скрипт, который читает файл, который содержит пути к файлам, которые будут скопированы, а затем копирует эти файлы в каталог:Интересные вопросы, связанные к тому, как «сП --parents» работает

1 #!/bin/csh 
2 # 
3 # This script copies source and executable files modified to solve issues 
4 # brought up by Veracode. 
5 # 
6 
7 set tempdir = '~/updatedfiles2' 
8 
9 foreach line ("`cat modifiedFiles`") 
*************here is the cp line************** 
10 `cp -a $line $tempdir` 
********************************************** 
11 end 

Что раньше работало нормально. С тех пор я решил, что хочу сохранить пути к этим файлам в виде дерева каталогов в том же каталоге tempdir, потому что происходят коллизии, когда файлы с разными путями имеют одинаковые имена. (т.е. /vobs/emv/integratedClient/jniWrapper/OEMIMAKEFILE и /vobs/mv_components/utilities/general/OEMIMAKEFILE)

Таким образом, я пытался использовать опцию --parents, например, так:

1 #!/bin/csh 
2 # 
3 # This script copies source and executable files modified to solve issues 
4 # brought up by Veracode. 
5 # 
6 
7 set tempdir = '~/updatedfiles2' 
8 
9 foreach line ("`cat modifiedFiles`") 
*************here is the cp line************** 
10 `cp -a --parents $line $tempdir` 
********************************************** 
11 end 

Когда я проверить это, он начинает пытаться скопировать полноту моей системы, начиная с корневой каталог, который не является тем эффектом, который я хочу. Я просто пытаюсь скопировать определенные файлы, сохраняя их структуру каталогов при их копировании.

Я нашел несколько объяснений --parents, но ни один не описывает ничего подобного тому, что я вижу. Это потому, что я использую --parents неправильно? Это мой входной файл? Я не уверен.

Содержание modifiedFiles (это значение tempdir) выглядит следующим образом:

... 
4 /vobs/emv/C_API/APIPrivate.cpp 
5 /vobs/mv_components/utilities/class/Array.c 
6 /vobs/mv_components/utilities/class/String1.c 
7 /vobs/mv_components/export_functions/code/write_nastran_ortho3_none.c 
... 

/vobs является корневой каталог, так что это может быть что-то осуществление с --parents. Кто-нибудь слышал о неограниченном рекурсивном копировании, несмотря на определенные пути к файлам и аргумент -r? Я недопонимаю --parents?

ответ

0

Вау, я чувствую себя немой.

Просматривая это снова и снова, я пришел, чтобы найти то, что я сделал неправильно.

Фактическая команда выше находится в сценарии csh. Когда команда заключена в передние тики (``) в сценарии csh, эта команда выполняется, а команда out этой команды используется оболочкой. Поэтому я делал cp, а затем выполнял вывод в оболочке. Я не уверен, почему он рекурсивно копировал вверх, но удаление этих передних клещей все фиксировало. Произошла предыдущая ошибка, которую я проигнорировал в своем первоначальном «рабочем» скрипте, и когда я добавил параметр --parents, уже сломанный скрипт сломался еще больше.

Мораль истории, будьте осторожны с передними клещами!

Для тех, кто заинтересован, прежде, чем:

... 
9 foreach line ("`cat modifiedFiles`") 
*************here is the cp line************** 
10 `cp -a --parents $line $tempdir` 
********************************************** 
11 end 
... 

И после того, как:

... 
9 foreach line ("`cat modifiedFiles`") 
*************here is the cp line************** 
10 cp -a --parents $line $tempdir 
********************************************** 
11 end 
... 

Кроме того, два из записей в файле ввода комментировались в стиле C /* comment */ Это было вызывая рекурсивное копирование из корневого каталога. Ха-ха .... эх. Глупый я.