Как заставить команду cp создавать необходимые папки для копирования файла в папку назначения
У меня возникла проблема при копировании файла с помощью команды 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 ответ(ов)
Можно также использовать команду find
следующим образом:
find ./ -depth -print | cpio -pvd newdirpathname
Этот подход позволяет рекурсивно искать файлы и каталоги в текущем каталоге, сохраняя их структуру, и копировать их в новую директорию, указанную в newdirpathname
. Опция -depth
заставляет find
обрабатывать содержимое каталогов перед самими каталогами, что может быть полезно для копирования.
Команда, которую вы привели, выполняет следующие действия:
mkdir -p \
dirname /nosuchdirectory/hi.txt``: Эта часть команды создаёт все необходимые директории для указанного пути/nosuchdirectory/hi.txt
. Флаг-p
позволяет создать промежуточные директории, если они не существуют. Командаdirname
возвращает путь к директории без имени файла, то есть в данному случае это будет/nosuchdirectory
.&&
: Этот оператор выполняет следующую команду только в случае успешного выполнения предыдущей команды.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
на название целевой директории. В противном случае вы получите ошибку, так как вы не можете скопировать директорию в файл.
Такого варианта не существует. Но вы можете выполнить команду mkdir -p перед копированием файла.
Я написал очень классный скрипт, который вы можете использовать для копирования файлов в несуществующие директории:
#!/bin/bash
if [ ! -d "$2" ]; then
mkdir -p "$2"
fi
cp -R "$1" "$2"
Теперь просто сохраните его, задайте права на выполнение и запускайте с помощью команды:
./cp-improved SOURCE DEST
Я добавил опцию -R, но это всего лишь черновик, я знаю, что его можно улучшить многими способами. Надеюсь, это поможет вам!
rsync
действительно работает! В вашем примере:
Для файла:
rsync -aqz _vimrc ~/.vimrc
Эта команда синхронизирует файл _vimrc
с файлом ~/.vimrc
в вашем домашнем каталоге. Ключи здесь означают следующее:
-a
: архивный режим, сохраняет все атрибуты файла.-q
: тихий режим, подавляет вывод неполезной информации.-z
: сжимает данные во время передачи, что может ускорить процесс, если вы передаете большие файлы.
Для директории:
rsync -aqz _vim/ ~/.vim
Эта команда синхронизирует содержимое директории _vim
с директорией ~/.vim
. Обратите внимание на слэш /
в конце имени директории _vim
, который указывает на то, что вы хотите скопировать именно содержимое данной директории, а не саму директорию.
Эти команды очень полезны для резервного копирования и синхронизации конфигурационных файлов и папок. Если у вас есть какие-либо дополнительные вопросы или вам нужна помощь с аргументами rsync
, не стесняйтесь спрашивать!
Linux: Копирование и создание директории назначения, если она не существует
Как использовать команду 'cp' для исключения определенной директории?
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?