Назад | Перейти на главную страницу

Команда CP создает рекурсивные каталоги

Итак, я пытаюсь сделать так, чтобы у меня есть файл, и мне нужно заменить около 100 файлов в расположении: /home/*/service*/files/ рекурсивно используя этот файл.

Я использовал следующую команду:

cp -r File.txt /home/*/service*/files
cp: overwrite `/home/xxx/servicexxx/files/CustomCommands.txt'? y
cp: overwrite `/home/xxx/servicexxx/files/files/tips.txt'? ^C

Почему он создает папку «файлы» внутри папки с файлами, а не просто заменяет уже существующий файл. Если я не использую переключатель «-r», он копирует правильно, но пропускает остальные 99 каталогов, показывающих «cp ommiting каталог"

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

cp: cannot create regular file `xxx': Text file busy

Вы не понимаете, как cp интерпретирует аргументы и как работает расширение оболочки. Сначала поговорим о расширении оболочки. Учтите, что у вас есть упрощенная структура каталогов / файлов, которая выглядит так:

/home/user1/service1/files/file1.txt
/home/user7/service100/files/file2.txt
/home/user22/service7/files/file3.txt

Теперь рассмотрим вашу команду:

cp -r File.txt /home/*/service*/files

Оболочка расширит второй аргумент на основе файлов, которые он может сопоставить перед выполнение cp. Вы можете увидеть, как это работает, заменив cp с участием echo. Фактическая команда, которую вы выполняете:

cp -r File.txt /home/user1/service1/files /home/user7/service100/files /home/user22/service7/files

Путь cp Команда работает, чтобы скопировать один или несколько источников в не замужем target, поэтому вы копируете первые три аргумента в последний аргумент: /home/user22/service7/files.

Если взглянуть на это снова и снова, это объясняет, почему ваш файл правильно скопирован в последний каталог, и вы получите небольшое количество cp: ommiting directory ошибки.

Чтобы добиться чего-то вроде того, что вы хотите сделать, вы можете использовать for цикл:

for target in /home/*/service*/files/; do
    cp -v File.txt $target
done

В Text File Busy ошибка немного описана в приведенной ниже ссылке и, вероятно, является артефактом вашего ошибочного использования cp. Я подозреваю, что цикл for, подобный приведенному выше, также подойдет для вашей двоичной замены.

https://stackoverflow.com/questions/10638283/can-text-file-busy-happen-when-two-processes-trying-to-execute-a-perl-file-in

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

Для проблемы с копированием воспользуйтесь помощью find, grep и xargs:

find /home -type f | grep \/home\/[[:alnum:]]+\/service[[:alnum:]]*\/ | xargs -l1 cp sourcefile 

но сначала проверьте, совпадают ли все нужные файлы, например. удалив последнюю трубу с xargs.

Я смог заставить вторую часть работать, используя параметр "cp -f", который перезаписывал работающий файл. Но я все еще не уверен в проблеме рекурсии.