mv 및 cp 디렉토리 계층 구조?

mv 및 cp 디렉토리 계층 구조?

mv나 또는 cp파일을 사용할 때 파일의 디렉터리 계층 구조를 이동하거나 복사할 수도 있나요 ?

예를 들어 I mv또는 cp dir1/dir2/file다른 경우에는 mv또는 cp file. 내가 또한 mv또는 을 원하면 어떻게 됩니까 cp dir1/dir2? 가 아니라 mkdir -p dir1/dir2하나의 명령으로 할 수 있나요?

답변1

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
}

음... 예상보다 시간이 조금 더 걸리지만 효과는 있을 것 같아요

편집 : As세바스티안 피에치의견에서 지적했듯이 의 작업에 의존하는 것은 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이용에 있어 각별한 주의를 당부 드립니다.

관련 정보