find + xargs : target으로 파일을 이동하는 것은 디렉토리가 아닙니까?


9

다음 명령을 실행할 때 :

> mkdir some_dir
> find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} some_dir

나는 수백 줄을 얻습니다.

mv: target `/foo/bar/XX.csv` is not a directory

왜? 나는 xargs가 실행될 것이라고 생각했다.

mv /foo/barXX.csv some_dir

find찾은 모든 파일에 대해 무슨 일이야? 그건 그렇고, 이것은 zsh와 함께합니다.

최신 정보:

업데이트 1 :

나는 시도했다 :

find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} -t some_dir

그러나 다음과 같은 몇 줄이 있습니다.

mv: cannot stat `{}': No such file or directory

명령이 내 파일을 올바르게 이동한다고 생각합니다.

업데이트 2 :

혼자 -t사용할 때 옵션 이 필요하지 않은 것 같습니다 mv. 예를 들어

> touch file1.txt
> touch file2.txt
> mkdir my_dir
> mv  file1.txt  file2.txt  my_dir

잘 작동합니다. 사용할 -t때 왜 필요 xargs합니까?

답변:


14

GNU ( find,, xargs& mv) 가 있다고 가정하면 명령을 다음과 같이 변경하십시오.

$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir

매뉴얼 페이지 에서 발췌mv

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

xargs ...의 명령은 이동 호출이 다음과 같이되도록 명령을 구성합니다.

 $ mv 1.csv 2.csv 3.csv ... -t some_dir

xargs가 필요하지 않습니다

find모든 작업 자체 를 수행 하여이 방법을 건너 뛸 수 있습니다 .

$ find /foot/bar/ -name '*.csv' -exec mv -t some_dir {} +

왜 필요한 mv -t ...가요?

이것은 xargs매번 실행될 명령에 전달할 파일 세트를 구성 하는 방식과 관련이 있습니다 (예 :) mv ....

mv수동으로 명령 을 실행할 때 파일 이름이 전달되는 파일 수를 제어하므로 -t my_dir대상 디렉토리를 항상 마지막에 배치 하므로 파일 이름이 필요하지 않아도됩니다 .

참고 문헌


감사! 이것은 매우 도움이됩니다. 나는 조금 혼란 스럽다 (내 업데이트 참조)
Amelio Vazquez-Reina

1
생성 된 명령은 mv -t some_dir 1.csv 2.csv 3.csv ...파일 인수가 마지막 이 되도록합니다. 즉 사용하기 위해, 문제의 오류입니다 {}당신이 통과해야 -I {}으로 xargs.
frostschutz

감사. 그것은 모든 것을 설명합니다. 업데이트 2에서 두 번째 질문은 어떻습니까? 내가 왜 -t여러 파일과 디렉토리가 필요 없는지 아십니까 mv?
Amelio Vazquez-Reina

1
@ user815423426-오늘 밤에 기회가 생기면 나중에 업데이트하겠습니다. 이유를 알고 있습니다.
slm

@ user815423426-질문을 업데이트했습니다 mv -t. wrt가 의미가 있는지 알려주십시오 .
slm

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