시기: busybox 찾기가 일괄 처리되지 않습니다. -구현하다

시기: busybox 찾기가 일괄 처리되지 않습니다. -구현하다

나는 busybox에만 접근할 수 있다.

다음과 같은 폴더가 있습니다.

prueba/$: ls
./uno
./dos
./tres

두 개의 하위 디렉터리(uno, dos)마다 다른 하위 디렉터리(tres)로 이동하려는 많은 파일(이름에 공백 및 비ASCII 문자 포함)이 있습니다.

그래서 저는 이렇게 했습니다(복사하고 yes를 사용할 때 중복을 방지하기 위해 [tres] 디렉토리에 이미 있는 모든 파일을 바꾸기 위해 이전에 mv -f에 문제가 있었기 때문에 문자를 이스케이프 처리했습니다). :

prueba/$: busybox find . -type f -not \( -path . -o -path ./tres \) -exec sh -c ' yes | mv "$1" ./tres ' sh {} \+

그러나 찾은 첫 번째 파일만 이동한 다음 종료합니다.

하지만 내가 실행하면 :

prueba/$: busybox find . -type f -not \( -path . -o -path ./tres \) -exec sh -c ' yes | mv "$1" ./tres ' sh {} \;

나는 내가 기대했던 것을 얻었습니다. 모든 파일은 하위 디렉터리 "uno" 및 "dos"에서 하위 디렉터리 "tres"로 이동됩니다.

;[암시적 루프]와 [암시적 배칭]이 있을 때 +활성화되는 내부 메커니즘은 무엇 입니까?

첫 번째 명령줄( ) +에 어떤 문제가 있나요 ?

다음은 불가능합니다.

mv -f ./uno/* ./dos/* ./tres/

저는 코드 한 줄만 실행하고 작업을 완료하면 되는 자동화 작업을 수행하고 있습니다. 게다가 그것은 지루한 해결책이다.

편집하다:

뒤에 이유find . -exec sh -c 'CMD "$1"' sh {} \;

"find -exec sh -c"를 사용해도 안전합니까?

답변1

다음으로 변경하세요.

find uno/ dos/ -type f -exec sh -c 'exec mv -f "$@" tres/' sh {} +

코드 문제:

  • find . -not -path ./tres확실히 제외 ./tres하지만 배제하지는 않습니다../tres/any-file-in-it
  • -exec sh 'mv "$1" tres' sh {} +sh인수만큼 많은 파일을 사용하여 호출하지만 첫 번째 파일( $1)만 이동합니다. "$@"다음으로 확장모두위치 인수는 작성한 것처럼 별도의 인수로 제공됩니다."$1" "$2" "$3" ... "$last"
  • 표준으로서의 참고 !가 비표준을 대체합니다.-not
  • 이는 +어떤 쉘에서도 특수 문자가 아니라는 점에 유의하십시오. 인용할 필요가 없습니다.
  • 먼저 메시지를 표시하지 않도록 하는 -f옵션에 유의하세요 . 여전히 를 사용하고 싶다면 이렇게 할 수 있습니다 . 왜냐하면 and 는 stdin을 상속 하고 거기에서 s를 읽기 때문입니다.mvyesyesyes | find ... -exec sh -c 'exec mv ...shmvfindy
  • mvGNU coreutils 및 최신 버전의 구현 을 busybox사용 하면 .shfind ... -exec mv -ft tres {} +

./tres현재 디렉터리의 파일을 제외한 모든 디렉터리에서 파일을 (재귀적으로) 이동하고 현재 디렉터리의 파일을 제외 하려면 다음을 수행해야 합니다.

LC_ALL=C find . -path ./tres -prune -o \
                -path './*/*' -type f -exec sh -c 'exec mv -f "$@" tres/' sh {} +

위의 내용은 에서 파일을 찾지 말라고 -prune지시하는 반면, 다른 파일( so 와 결합되어 문자뿐만 아니라 모든 바이트 문자열과 일치)의 경우 경로에 선행 디렉터리 뒤에 하나 이상이 포함된 파일로 제한되므로 현재 디렉터리의 파일은 제외됩니다.find./tres-path './*/*'LC_ALL=C*/./

그리고 zsh:

set -o extendedglob # best in ~/.zshrc
mv -f -- (^tres)/**/*(D.) tres/

그러나 현재 디렉토리에 해당 디렉토리에 대한 심볼릭 링크가 있으면 이를 따릅니다. 매개변수 수 및 크기에 대한 시스템 제한에 도달하는 경우에도 실패할 수 있습니다( zargs이 문제 해결 참조).

대조적으로 glob은 파일 목록을 정렬하므로 동일한 이름을 가진 파일이 여러 개 있는 경우 최종적으로 나오는 파일은 더 결정적입니다(이것은 경로가 마지막에 있는 파일이 되지만 순서가 오기 때문에 주의하세요 find) 마지막 ) 은 어휘적입니다.zsh./tresunodos다른 모든 것들은 사라질 것이다)


1 숫자 순서를 얻기 위해 glob 한정자를 추가할 수 있지만 n이는 숫자 시퀀스에만 작동합니다(예: dir2before dir10, unoafter 정렬은 계속됨 dos).

관련 정보