Linux에서 xargs를 사용하여 파일을 어떻게 이동합니까?


24

나는 이것을 시도하고 있으며 작동하지 않습니다.

ls file_* | xargs mv {} temp/

어떤 아이디어?


다중 파일 이동 버전을 가진 사람이 있습니까? ( xargs -n10예를 들어)
Gert van den Berg

답변:


31

OS X에서 :

ls file_* | xargs -J {} mv {} temp/

Linux에서 :

ls file_* | xargs -i {} mv {} temp/

1
Linux에서는 적어도 /끝에는 선택 사항입니다. 원하는 경우 포함 할 수 있지만 필요하지는 않습니다.
Scott

4
@ user1953864 : -i(또는 -J)는 인수로 끝나는 대신 들어오는 인수로 대체 될 토큰을 지정합니다. man xargs
Amadan

14
당신은 할 수 말할 필요가 -i{}공백없이. 또는 -I {}.
Scott

1
"{}"대신 "%"를 사용하는 것도 효과적입니다. %는 무엇을 의미하고 {}는 무엇을 의미합니까? 예 : ls file_ * | xargs -I % mv % temp /
dmonopoly 3

3
@dmonopoly : 그들은 아무 의미 가 없습니다 . 매개 변수가 무엇이든 -i대체되고 있습니다. ls file_* | xargs -iFOO mv FOO temp/정확히 동일하게 작동합니다.
Amadan

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findls쉘이 허용하는 프로그램 인수의 수보다 많은 파일이있을 수있는 것보다 낫습니다 .


2
이 질문은 file_*현재 디렉토리 의 파일 만 처리하려는 반면, find추가 옵션 없이는 현재 디렉토리 아래의 전체 디렉토리 트리를 검색합니다.
Scott

1
예, 맞습니다 -maxdepth 0이를 방지하기 위해 추가하십시오 .

"더 나은"주관적입니다. 더 강력하고 복잡하며 느립니다. 그리고 동안은 mv당신이 다른 용도가 수도 함께 또는 개별적으로 파일을 처리 할 경우 상관하지 않는다.
Amadan

편집 됨 (추가됨 -maxdepth 0)

8

mv에서 -t "target directoty 지정"을 사용하면 파일 *을 대상 디렉토리 / temp로 이동해야합니다.

예 :-#ls -l 파일 * | xargs mv -t / temp


4

@ user1953864에서 제안한대로 { -i, -J}는 들어오는 인수로 대체 될 토큰을 지정합니다.

예를 들면 ls다음과 같습니다.

something.java  exampleModel.java  NewsQueryImpl.java  readme someDirectory/

그런 다음 모든 Java 파일을 someDirectory 폴더로 이동하는 방법 xargs은 다음과 같습니다.

리눅스에서

ls *.java | xargs -i mv {} someDirectory/

MacOS에서

ls *.java | xargs -J mv {} someDirectory

0

다른 해결책은 다음과 같습니다.

 for f in file_* ; do
   mv $f temp/$f
 done

단점은 mv각 파일에 대해 새로운 프로세스를 분기한다는 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.