![find + xargs를 사용하여 파일 이동: 대상이 디렉터리가 아닙니까?](https://linux55.com/image/33913/find%20%2B%20xargs%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%8F%99%3A%20%EB%8C%80%EC%83%81%EC%9D%B4%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EA%B0%80%20%EC%95%84%EB%8B%99%EB%8B%88%EA%B9%8C%3F.png)
다음 명령을 실행할 때:
> 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
find
GNU( , 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