Итак, я пытаюсь сделать так, чтобы у меня есть файл, и мне нужно заменить около 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, подобный приведенному выше, также подойдет для вашей двоичной замены.
Это не сработает. Вы можете скопировать один источник в одно место назначения или несколько источников в один каталог, но не один исходный файл в несколько файлов назначения.
Для проблемы с копированием воспользуйтесь помощью find
, grep
и xargs
:
find /home -type f | grep \/home\/[[:alnum:]]+\/service[[:alnum:]]*\/ | xargs -l1 cp sourcefile
но сначала проверьте, совпадают ли все нужные файлы, например. удалив последнюю трубу с xargs
.
Я смог заставить вторую часть работать, используя параметр "cp -f", который перезаписывал работающий файл. Но я все еще не уверен в проблеме рекурсии.