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

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

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

  • Скопировать содержимое папки удаленного сервера на текущий сервер?
  • Как скопировать папку другим, но НЕ путем слияния / добавления
  • FTP «помещает» не копирование файла на удаленный хост при запуске из сценария оболочки, но копирует файл на удаленный хост при запуске вручную
  • 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

    Во время загрузки поддерживайте GNU / Linux Desktop System

    Не удается удалить избыточные разделы

    Создание слайд-шоу под Linux

    Top и ps не показывают тот же результат процессора

    Потерянные заголовки окон и все после выбора темы плохого окна в Linux Mint

    Каковы наилучшие средства резервного копирования и восстановления для системы SUSE Linux

    Команда, которая принимает один числовой аргумент и выводит день недели по формуле

    Любой инструмент для сохранения символических ссылок?

    Как вызвать другую часть скрипта с -x

    Могут ли файлы меняться при переходе от ext2 к ext3 в ext4?

    Удалить все, кроме самого большого файла определенного типа

    IRSSI: HilightWin показывает Joins / Parts / Quits

    Как настроить параметры бумаги по умолчанию для Wine?

    Установите разрешения по умолчанию по типу файла (по крайней мере, в Vim)

    Любой текстовый редактор, который перечисляет числа слов в файле?

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