иерархия каталогов mv и cp?

Могу ли я также перемещать или копировать иерархию каталогов файла, когда я mv или cp файл?

Например, если я mv или cp dir1/dir2/file другом месте, он будет только mv или cp file . Что делать, если я хочу также mv или cp dir1/dir2 ? Вместо mkdir -p dir1/dir2 можно ли это сделать с помощью одной команды?

    One Solution collect form web for “иерархия каталогов mv и cp?”

    Вы можете использовать переключатель --parents :

     $ mkdir -p step1/step2/step3 $ touch step1/step2/step3/file $ mkdir copy $ cp --parents step1/step2/step3/file copy $ ls copy/step1/step2/step3/file copy/step1/step2/step3/file 

    mv , однако, не имеет переключателя --parents , но вы можете сделать что-то вроде:

     $ find step1/step2/step3 -name "file" -exec cp --parents {} copy/ \; -delete 

    Который будет:

    • Найдите файл.
    • Скопируйте его (вместе со своими родителями) в пункт назначения.
    • Удалите оригинал.

    Вы можете создать для этого функцию:

     mvparents() { [[ $# -ne 2 ]] && echo "2 arguments needed." && return [[ ! -r "$1" ]] && echo "$1 is not readable." && return [[ ! -d "$2" ]] && mkdir -p "$2" find $(dirname $1) -name "$(basename $1)" -exec cp --parents {} $2/ \; -delete } $ mvparents step1/step2/step3/file copy/ 

    Это может потребовать нескольких корректировок, если вы попытаетесь переместить несколько файлов. Вот пример (работающий в bash, но никаких гарантий для других оболочек):

     mvparents() { [[ $# -lt 2 ]] && echo "Usage: $0 [source] <source> ... [destination]." && return # Get the destination directory. for dest; do true; done [[ ! -d "$dest" ]] && mkdir -p "$dest" # Copy the arguments and remove the destination. parameters=( "$@" ) unset parameters[${#parameters[@]}-1] # For each source file: find, copy, delete. for source in "${parameters[@]}"; do if [ -r "$source" ]; then find $(dirname $source) -name "$(basename $source)" -exec cp --parents {} $dest/ \; -delete else echo "$0: $source is not readable." fi done } 

    Ну … это немного дольше, чем я ожидал, но он должен делать работу

    Edit: Как заметил Себастьян Пьех в комментарии, полагаясь на cp чтобы выполнять работу mv это убийца производительности, так как mv первоначально не нужно копировать файл, просто редактируйте его метаданные. Возможно, вы захотите заменить указанный выше цикл:

     for source in "${parameters[@]}"; do if [ -r "$source" ]; then [[ ! -d "$dest/$(dirname $source)" ]] && mkdir -p "$dest/$(dirname $source)" find $(dirname $source) -name "$(basename $source)" -exec mv {} "$dest/$(dirname $source)" \; -delete else echo "$0: $source is not readable." fi done 

    Однако, поскольку эта вещь сильно зависит от стоимости $PWD , я бы попросил вас быть очень осторожным, если вы ее используете.

    Interesting Posts

    Использование труб для отображения первых двух и двух последних пользователей в системе?

    Модули Debian Wheezy и perl, установленные в / root, не являются системой

    Как проверить, какие бинарные файлы зависят от определенных файлов в / lib?

    Как сказать apt использовать последний пакет по умолчанию?

    Adobe Reader необходимо восстановить или удалить (элементарная ОС)

    Создание реального универсального загрузочного диска с авторучкой

    / usr / bin / ld: не удается найти -lfl

    Перегрузка PCI с помощью Xen

    Правильно ли это задание sar / sysstat cron?

    Как отправить команду в фоновый режим с помощью ssh на удаленной системе

    Как проверить, полностью ли загружено видео?

    Использование pkg add с изображением NanoBSD

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

    Каково рассеивание мощности процессора и как оно работает?

    Как узнать, поддерживается ли сторонний репозиторий?

    Linux и Unix - лучшая ОС в мире.