여러 파일을 복사하고 동시에 대상 디렉터리를 생성하시겠습니까?

여러 파일을 복사하고 동시에 대상 디렉터리를 생성하시겠습니까?

나는 읽었다파일을 복사하는 동안 대상 디렉터리를 만드는 방법은 무엇입니까?

하지만 거기의 솔루션은 복사하려는 경우에만 작동합니다.하나문서.

아직 존재하지 않는 디렉토리에 여러 파일을 복사하고 하나의 명령으로 자동으로 생성하려면 어떻게 해야 합니까?

예를 들어:

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}"

성능과 관련하여 evalbash 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모든 (하위) 폴더가 자동으로 생성됩니다! 최고,

화려한 나비

관련 정보