dir1,dir2,dir3,dir4
Linux 상자에 여러 개의 디렉토리 { }가 있습니다 .
각 디렉터리에는 해당 디렉터리 { }에 백업하려는 파일이 여러 개 있습니다(동일한 확장자를 사용하여 .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 …
. 이전 문제가 종료 상태에 영향을 미치게 하려면 추가 논리가 필요합니다.