6

Как заставить команду cp создавать необходимые папки для копирования файла в папку назначения

1

У меня возникла проблема при копировании файла с помощью команды cp в директорию, которая может не существовать. Мне нужно, чтобы cp автоматически создавала недостающую папку в случае необходимости.

Я попробовал следующую команду:

[root@file nutch-0.9]# cp -f urls-resume /nosuchdirectory/hi.txt
cp: cannot create regular file `/nosuchdirectory/hi.txt': No such file or directory

Как можно решить эту проблему и заставить cp создавать директории, если они отсутствуют?

4 ответ(ов)

0

Можно также использовать команду find следующим образом:

find ./ -depth -print | cpio -pvd newdirpathname

Этот подход позволяет рекурсивно искать файлы и каталоги в текущем каталоге, сохраняя их структуру, и копировать их в новую директорию, указанную в newdirpathname. Опция -depth заставляет find обрабатывать содержимое каталогов перед самими каталогами, что может быть полезно для копирования.

0

Команда, которую вы привели, выполняет следующие действия:

  1. mkdir -p \dirname /nosuchdirectory/hi.txt``: Эта часть команды создаёт все необходимые директории для указанного пути /nosuchdirectory/hi.txt. Флаг -p позволяет создать промежуточные директории, если они не существуют. Команда dirname возвращает путь к директории без имени файла, то есть в данному случае это будет /nosuchdirectory.

  2. &&: Этот оператор выполняет следующую команду только в случае успешного выполнения предыдущей команды.

  3. cp -r urls-resume /nosuchdirectory/hi.txt: Эта часть команды копирует рекурсивно (с флагом -r) содержимое директории urls-resume в файл или директорию /nosuchdirectory/hi.txt. Следует обратить внимание, что если hi.txt не является директорией, то здесь может произойти ошибка, если urls-resume — это директория.

Итак, эта команда создаст нужные директории и затем попытается скопировать содержимое urls-resume в hi.txt. Если вы имели в виду, что хотите скопировать содержимое urls-resume именно в директорию, вам следует изменить название hi.txt на название целевой директории. В противном случае вы получите ошибку, так как вы не можете скопировать директорию в файл.

0

Такого варианта не существует. Но вы можете выполнить команду mkdir -p перед копированием файла.

Я написал очень классный скрипт, который вы можете использовать для копирования файлов в несуществующие директории:

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"

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

./cp-improved SOURCE DEST

Я добавил опцию -R, но это всего лишь черновик, я знаю, что его можно улучшить многими способами. Надеюсь, это поможет вам!

0

rsync действительно работает! В вашем примере:

Для файла:

rsync -aqz _vimrc ~/.vimrc

Эта команда синхронизирует файл _vimrc с файлом ~/.vimrc в вашем домашнем каталоге. Ключи здесь означают следующее:

  • -a: архивный режим, сохраняет все атрибуты файла.
  • -q: тихий режим, подавляет вывод неполезной информации.
  • -z: сжимает данные во время передачи, что может ускорить процесс, если вы передаете большие файлы.

Для директории:

rsync -aqz _vim/ ~/.vim

Эта команда синхронизирует содержимое директории _vim с директорией ~/.vim. Обратите внимание на слэш / в конце имени директории _vim, который указывает на то, что вы хотите скопировать именно содержимое данной директории, а не саму директорию.

Эти команды очень полезны для резервного копирования и синхронизации конфигурационных файлов и папок. Если у вас есть какие-либо дополнительные вопросы или вам нужна помощь с аргументами rsync, не стесняйтесь спрашивать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь