여러 디렉터리의 Bash 파일을 여러 해당 백업 디렉터리로 복사합니다.

여러 디렉터리의 Bash 파일을 여러 해당 백업 디렉터리로 복사합니다.

dir1,dir2,dir3,dir4Linux 상자에 여러 개의 디렉토리 { }가 있습니다 .

각 디렉터리에는 해당 디렉터리 { }에 백업하려는 파일이 여러 개 있습니다(동일한 확장자를 사용하여 .zip이라고 함) dir1-bck,dir2-bck,dir3-bck,dir4-bck. 전체 폴더를 각각 몇 개의 파일만 백업할 필요는 없습니다.

dir1/*.zip드롭인 에서 파일을 복사하려면 어떻게 해야 합니까 dir1-bck? . . 제공된 디렉토리 목록을 확인하세요. 나는 현재 다음을 사용하고 있습니다:

cp -r src/dir1/*.zip dest/dir1-bck/
cp -r src/dir2/*.zip dest/dir2-bck/
cp -r src/dir3/*.zip dest/dir3-bck/
cp -r src/dir4/*.zip dest/dir4-bck/

작동하지만 개선의 여지가 큽니다.

매뉴얼 페이지와 포럼의 유사한 게시물을 살펴보면 xargs그것이 이 작업을 위한 도구인 것 같지만 제대로 이해할 수 없는 것 같습니다.

답변1

아마도 for루프가 딱 맞을 것입니다. 정확한 형식은 이러한 디렉터리의 이름이 지정되는 방식에 따라 다릅니다. 그것은 될 수 있습니다:

cd src || exit 1
for d in "dir"{1..4}; do
   cp -r "$d"/*.zip "../dest/$d-bck/"
done

노트:

  • src( ) 내에서 작업하는 것이 좋기 cd src때문에 변수에는 추가 처리 없이 대상 경로에서 사용할 수 있는 문자열이 포함되어 있습니다. 이 경우에는 앞에 붙여서 대상 경로를 조정했지만 ../일반적으로 와 같을 수 있습니다 "/full/path/to/dest/$d-bck/".
  • dir이름을 공백 등으로 대체하는 경우를 대비해 인용했습니다 . $d같은 이유로 이중 인용을 했습니다 ..
  • 파일 이면 *.zip필요하지 않습니다 -r.

또는 다음과 같은 for줄이 있을 수 있습니다.

for d in dir1 dir2 dir3 dir4; do

이는 임의로 이름이 지정된 몇 개의 디렉터리를 지정해야 하는 경우 유용합니다. 또는:

for d in *; do

다음과 같이 몇 가지 개선이 가능합니다.

( cd src || exit 1
for d in *; do
   dst="../dest/$d-bck/"
   [ -d "$d" ] && mkdir -p "$dst" && cp -- "$d"/*.zip "$dst"
done )

개선 사항:

  • 모든 코드는 서브쉘( (…)) 에서 실행되므로 cd코드를 터미널에 붙여넣어도 현재 쉘에는 영향을 미치지 않습니다. 독립형 스크립트(소스가 아닌 실행)여야 한다면 서브셸은 관련이 없습니다.
  • $d디렉토리인지 확인합니다 .
  • 대상 디렉토리를 생성하려고 시도합니다(존재하지 않는 경우).
  • cp대상 디렉터리가 존재하는 경우에만 계속 진행합니다 .
  • 우리는 사용이중 대시$d대시로 시작하는 경우 .

가능한 문제:

  • "$d"/*.zip너무 많은 항목( Argument list too long)으로 확장될 수 있습니다. 원래 명령에도 같은 방식으로 "결함이 있습니다". "각 디렉토리에 파일이 몇 개만 있는" 경우에는 문제가 되지 않습니다.
  • "$d"/*.zip확장할 수 없습니다( *문자 그대로 유지됨). 해를 끼치지 않아야 하며 대상 디렉토리가 미리 생성됩니다. 이러한 경우 디렉터리 생성을 억제하기 위해 추가 논리가 필요할 수 있습니다.
  • 전체 스니펫의 종료 상태는 마지막 [ … && mkdir … && cp …. 이전 문제가 종료 상태에 영향을 미치게 하려면 추가 논리가 필요합니다.

관련 정보