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

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

나는 읽었다파일을 복사하고 동시에 대상 디렉토리를 생성하려면 어떻게 해야 합니까?

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

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

예를 들어:

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은 마지막 매개변수에 해당합니다. 음수 오프셋은 끝부터 계산되기 때문입니다. 공간이 필요하고 그렇지 않으면 형태가 될 것입니다 ${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보다 훨씬 빠릅니다). 솔루션이 포함된 대시 5.7 eval(다른 하나는 지원되지 않음)은 "${@: -1}"솔루션이 포함된 ksh93보다 약간 빠릅니다. 따라서 귀하의 사례(스크립트, 대화형 사용, 특정 셸 기능 지원 등)에 따라 선택하십시오... 그러나 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자동으로 모든 (하위)폴더를 생성합니다! 최상의,

나비

관련 정보