find + xargs를 사용하여 파일 이동: 대상이 디렉터리가 아닙니까?

find + xargs를 사용하여 파일 이동: 대상이 디렉터리가 아닙니까?

다음 명령을 실행할 때:

> 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?

답변1

findGNU( , 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 ...은 move 호출이 다음과 같이 구성됩니다.

 $ 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

인용하다

답변2

find 명령 대신 ls 명령을 사용할 수도 있습니다.

ls /foot/bar/*.csv | xargs  mv -t some_dir

관련 정보