mv 및 cp 디렉토리 계층 구조? [복사]

mv 및 cp 디렉토리 계층 구조? [복사]

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

예를 들어 I mv또는 다른 곳의 경우에는 또는 cp dir1/dir2/file만 됩니다 . 나도 그걸 원하면 어떡하지 ? 명령어 하나로는 안되나요 ?mvcp filemvcp dir1/dir2mkdir -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
}

흠... 예상보다 시간이 조금 더 걸렸지만 작업은 완료될 것입니다

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

관련 정보