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
이용에 있어 각별한 주의를 당부 드립니다.