`-exec` 및 `xargs`를 사용할 때 대시("-")로 시작하는 파일 이름을 처리합니다.

`-exec` 및 `xargs`를 사용할 때 대시("-")로 시작하는 파일 이름을 처리합니다.

나는 팔로우하고 있다이 문제여기에 있는 일부 파일 이름에는 파일 이름 시작 부분에 대시가 포함되어 있습니다. 이는 추가 옵션으로 해석됩니다 cp.

다음과 같은또 다른 질문(ServerFault 관련), 명령을 다음과 같이 변경해 보았습니다.

shuf -zn8 -e *.jpg | xargs -0 cp -vt -- {} target/ 

또는

shuf -zn8 -e *.jpg -exec cp -vt -- {} target/

소용이 없습니다. -파일 이름의 시작 부분을 어떻게 처리합니까 ?

답변1

대시로 시작하는 파일 이름을 처리하는 shuf것 같지 않습니다 . 명령 cp에 이중 대시를 추가해 보십시오 .shuf

shuf -zn8 -e -- *.jpg | xargs -0I{} cp -vt -- "{}" target/ 

find대신 이것을 사용하겠습니다 shuf.

find . -type f -name '*.jpg' -print0 | xargs -0I{} cp "{}" target/

cpfind또한 이 경우 접두사가 붙은 파일 이름이 반환되므로 이중 대시가 필요하지 않습니다 ./.

답변2

-t옵션(GNU 확장)은 대상 디렉터리인 하나의 인수를 사용합니다.

를 사용하면 선택한 파일을 이름이 지정된 디렉터리에 복사 xargs -0 cp -vt -- target/하려고 시도 하지만 여전히 끝을 표시할 수 있는 옵션이 없습니다. 또한 옵션의 끝을 표시해야 합니다 .target/--shuf

{}findAND 전용 -exec술어 또는 AND는 xargs사용될 때 특별 -I'{}'하지만 여기서는 필요하지 않습니다. 술어 shuf가 없습니다 -exec.

원하는 곳은 다음과 같습니다.

shuf -zen8 -- *.jpg | xargs -r0 cp -vt target --

또는

shuf -zen8 ./*.jpg | xargs -r0 cp -vt target

또한 xpression 기반 정렬 glob 한정자를 zsh사용할 수도 있습니다 .eo

cp -v -- *.jpg(oe['REPLY=$RANDOM'][1,8]) target/

shuf이는 모든 시스템에서 작동하는 접근 방식에 비해 장점이 있으며( zsh설치된 경우 일부 시스템에서는 비표준을 삭제해야 할 수도 있음 ) 현재 디렉터리에 두 개의 파일이 있어도 -v실패합니다 (실행이 실패함) .jpgshuf너무 많이 논쟁하다실수).

관련 정보