다음 명령을 실행할 때:
> 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