mv -t와 동등한 linux/bash

mv -t와 동등한 linux/bash
ls -al | grep -v '^d' | xargs mv -t mysubdir

저는 Red Hat 시스템에서 위의 명령을 광범위하게 사용합니다.

현재 디렉터리의 모든 파일을 mysubdir로 이동합니다.

$ mv --version
Usage: mv [-f] [-i] [-e warn|force|ignore] f1 f2
       mv [-f] [-i] [-e warn|force|ignore] f1 ... fn d1
       mv [-f] [-i] [-e warn|force|ignore] d1 d2

위 명령에 해당하는 HP-UX는 무엇입니까(HP-UX 11i 버전 2007년 2월 3일)

답변1

xargsHP-UX 11i에 플래그가 있으면 이를 수행할 수 있지만 다음 출력을 -I어떻게 사용할 수 있을지는 잘 모르겠습니다 .ls -lmv

ls -al | grep -v '^d' | xargs -I {} mv {} mysubdir

그렇게 할 수 없다면 이것이 내가 선호하는 해결책이 될 것이라고 생각합니다.

ls -a | while read ITEM; do test ! -d "$ITEM" && mv "$ITEM" mysubdir; done

둘 다 쉘 함수나 스크립트에 포함될 수 있으므로 한 줄의 길이가 반드시 관련이 있는 것은 아닙니다.

답변2

mv -t이는 GNU 명령(Linux의 명령)이 제공하는 편리함입니다 mv. 다른 유닉스 변형에는 이것이 없습니다. 대상을 마지막에 입력해야 합니다. 이로 인해 xargsor 와 함께 사용하는 것이 덜 편리해 졌습니다 find … -exec(그래서 mv -t이것이 발명되었습니다).

매개변수를 올바른 순서로 가져오는 한 가지 방법은 셸을 호출하는 것입니다.

… | xargs sh -c 'mv "$@" "$0"' mysubdir

(셸의 매개변수 0번입니다. mysubdir매개변수는 위치 매개변수를 구성하여 일괄적으로 전달됩니다.)xargs"$@"

이것은 xargs강력하지 않습니다. 입력에 특별한 인용 구문이 필요합니다. 파일 이름에 공백이나 문자 중 하나가 포함되어 있으면 \"'코드 조각이 깨집니다. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?더 많은 정보를 알고 싶습니다. 파일 이름의 특수 문자 문제를 방지하려면 다음을 사용하십시오 find … -exec ….

find . -name . -o -type d -prune -o sh -c 'mv "$@" "$0"' mysubdir {} +

( -name . -o -type d -prune -o하위 디렉터리를 반복하지 않고 건너뜁니다.)

디렉터리가 아닌 디렉터리를 이동하는 사용 사례의 경우 mysubdir하위 디렉터리 자체가 아직 포함되지 않은 경우 모든 파일을 이동한 다음 디렉터리를 다시 이동하는 것이 더 간단합니다.

mv * mysubdir/; mv mysubdir/*/ .

또는 하위 디렉터리로 재귀적으로 이동하지 않으려면 셸 루프를 사용하여 파일을 열거하고 디렉터리에 속한 파일을 건너뛸 수 있습니다.

for x in ./*; do
  [ -d "$x" ] || mv "$x" mysubdir/
done

관련 정보