나는 읽었다파일을 복사하는 동안 대상 디렉터리를 만드는 방법은 무엇입니까?
하지만 거기의 솔루션은 복사하려는 경우에만 작동합니다.하나문서.
아직 존재하지 않는 디렉토리에 여러 파일을 복사하고 하나의 명령으로 자동으로 생성하려면 어떻게 해야 합니까?
예를 들어:
cd /tmp/
mkdir a/
cd a/
touch x1 x2
cp --magic * ../b/c/d/
따라서 이 두 파일의 최종 순서 x1
는 다음과 같습니다 x2
.
/tmp/b/c/d/x1
/tmp/b/c/d/x2
답변1
사용:
$ copy() { mkdir -p -- "${@: -1}" && cp -- "$@" ; }
$ copy * ../b/c/d/
참고: bash, ksh93 및 zsh에서 작동합니다.
"${@: -1}"
${parameter:offset}
오프셋에서 시작하는 모든 인수 형식 에 해당합니다 . 오프셋 -1은 마지막 인수에 해당합니다. 음수 오프셋은 끝부터 계산되기 때문입니다. 공백이 필요하고 그렇지 않으면 form 입니다 ${parameter:-word}
. 자세한 내용은 bash 매뉴얼을 참조하세요.
"$@"
정확히 필요한 매개변수 목록으로 확장됩니다 cp
.
참고 2: mikeserv가 제안한 대로 다음을 사용할 수 있습니다.
eval 'mkdir -p -- "${'"$#"'}"'
다음보다 이식성이 더 좋습니다(POSIX).
mkdir -p -- "${@: -1}"
성능과 관련하여 eval
bash 4.3.30을 사용하는 솔루션은 훨씬 빠르지만 ksh 93u+ 및 zsh 5.0.6을 사용하는 다른 솔루션은 훨씬 빠릅니다(ksh93 및 zsh는 두 경우 모두 bash보다 훨씬 빠릅니다). 솔루션을 사용하면 dash 5.7이 사용됩니다 eval
. 다른 것을 지원하지 않습니다) 솔루션을 사용하면 ksh93보다 약간 빠릅니다 "${@: -1}"
. 따라서 상황(스크립팅, 대화형 사용, 특정 셸 기능 지원 등)에 따라 선택하십시오. 그러나 cp
(대부분의 시간이 소요되는) 컨텍스트에서는 이러한 성능 차이가 발생하지 않습니다. 눈에 거슬리지 않습니다.
테스트에 사용하는 스크립트:
i=50000
while [ $i -ne 0 ];
do
# : "${@: -1}"
eval ': "${'"$#"'}"'
i=$((i-1))
done
(해당 줄을 주석 처리 eval
하고 다른 솔루션에 대해서는 이전 줄의 주석 처리를 제거합니다), 다음과 같이 호출됩니다.
time sh ./tst `seq 1000`
time bash ./tst `seq 1000`
time ksh93 ./tst `seq 1000`
time zsh ./tst `seq 1000`
답변2
나는 같은 문제가 있었고 tar
그것을 해결하는 데 사용했습니다! 이와 같이:
tmpfile=/tmp/myfile.tar
files="/some/folder/file1.txt /some/other/folder/file2.txt"
targetfolder=/home/you/somefolder
tar --file="$tmpfile" "$files"
tar --extract --file="$tmpfile" --directory="$targetfolder"
이 경우 tar
모든 (하위) 폴더가 자동으로 생성됩니다! 최고,
화려한 나비