한 디렉터리에서 다른 디렉터리로 1000개의 파일을 이동하고 싶습니다. 원래 디렉토리에 있으면 할 수 있지만 이렇게 하면 됩니다.
mv $(ls /home/jeremy/source|tail -1000) /home/jeremy/dest
다른 곳에서는 경로가 제거되므로 어떻게든 경로를 추가해야 합니다. 나는 $가 편리하다고 생각하고 까다로워 보이기 때문에 xargs를 피하고 싶습니다.
답변1
명령줄이 너무 길어지지 않고 명령이 작동하는 경우 xargs
다음과 같이 사용할 수 있습니다(까다롭습니다).
ls /home/jeremy/source | tail -1000 | xargs mv -t /home/jeremy/dest
이는 파일 이름(또는 경로)에 줄 바꿈 및 기타 특수 문자가 없다고 가정합니다. 그렇지 않으면 tail이 제대로 작동하지 않고 xargs가 분할 파일 이름을 얻습니다(지정하지 않는 한 줄에서 작동하기 때문입니다 xargs -0
).
매개변수를 사용하면 대상에 복사해야 하는 파일 매개변수 앞에 대상 디렉터리를 지정할 -t
수 있습니다 .mv
답변2
GNU의 최신 [1] 버전을 사용 findutils
하고 다음을 수행하십시오 coreutils
.
find /home/jeremy/source -print0 |
tail -z -n 1000 |
xargs -0 -r mv -t /home/jeremy/dest/
-print0
및 -z
옵션은 -0
세 가지 도구 모두 NUL 문자를 파일 이름/레코드 구분 기호로 사용하도록 지시합니다. 이렇게 하면 파일 이름에 문자가 포함된 파이프를 안전하게 사용할 수 있습니다.
tail
귀하의 버전 이 head
이 옵션을 지원하지 않는 경우 -z
파일 이름 구분 기호로 개행 문자를 사용할 수 있습니다(개행 문자를 포함하는 파일 이름 이외의 파일 이름에는 안전합니다).
find /home/jeremy/source |
tail -n 1000 |
xargs -r -d '\n' mv -t /home/jeremy/dest/
그런데 xargs
전혀 까다롭지 않습니다 . 이것은 stdin에서 데이터를 가져와 이를 사용하여 프로그램을 실행하는 매우 간단한 명령입니다(stdin의 데이터는 프로그램 명령줄에서 인수로 사용됩니다). 이것은 매우 유용한 도구이며 배우는 데 약간의 시간을 투자할 가치가 있습니다.
게다가 $(ls ...)
유사하고 유사하지만 xargs
공백, 쉘 와일드카드(와일드카드 등)를 포함한 대부분의 문제(NUL을 구분 기호로 사용하는 경우)를 방지하므로 잘 작성된 스크립트는 이러한 문제로 인해 손상되지 않도록 주의해야 합니다. .
[1] 언제 option 이 head
있었는지 모르겠지만 지난 몇 년 동안 많은 GNU 도구(NUL 포함 )가 NUL을 입력 레코드 구분 기호로 사용하는 기능을 얻었습니다. 그 전에는 .tail
-z
sort
find
xargs
유용한 NUL 구분 기호 -z
를 잃지 않고 이러한 옵션을 사용하여 길고 복잡한 파이프라인을 구축 할 수 있으므로 이는 매우 유용합니다 .-Z
-0