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
}
흠... 예상보다 시간이 조금 더 걸렸지만 작업은 완료될 것입니다
편집 : 같이세바스티안 피에치의견에서 지적했듯이 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
이용에 있어 각별한 주의를 당부 드립니다.