mv -t와 동등한 macOS/bash

mv -t와 동등한 macOS/bash

저는 macOS를 사용하고 있으며 Bash에서 다음 명령을 실행하려고 합니다.

cd root  ||  exit
shopt -s dotglob
for d in ./*
do
        if [ -d "$d" ]
        then
                find "$d" -type f -exec mv -i -t "$d" {} +
                find "$d" -mindepth 1 -type d -delete
        fi
done

macOS의 명령은 플래그가 디렉터리를 지정하는 것을 mv허용하지 않으며 -t다음 오류를 표시합니다.

mv: illegal option --t
usage: mv [-f | -i | -n] [-v] source target

macOS에서 이 작업을 어떻게 수행하나요?

답변1

그렇지 않은 경우 -t대상 디렉터리를 옵션이 아닌 마지막 인수로 남겨 두어야 합니다 mv. 이는 두 가지 옵션을 제공합니다. find대상 디렉토리 앞에 파일 이름을 넣거나 mv동일한 작업을 수행하는 다른 것을 찾는 것입니다. 따라서 다음 중 하나를 수행하세요.

find "$d" -type f -exec mv -i {} "$d" \;

또는:

export d; find "$d" -type f -exec sh -c 'exec mv -i "$@" "$d"' sh {} +

첫 번째 명령에서는 mv각 파일에 대해 실행합니다. 두 번째에서는 sh -c ...파일 배치에 대해 실행된 다음 다시 mv전체 배치에 대해 실행됩니다. 두 번째 옵션은 아마도 훨씬 빠르지만 대화형 확인을 사용하고 있으므로 실제로는 중요하지 않습니다.

답변2

배쉬와는 아무 관련이 없습니다. 이것은 mv명령입니다.

mv해당 옵션을 얻으려면 gnu를 설치할 수 있습니다 -t. 또는 다른 답변을 확인하되 약간의 추가 조언이 필요합니다.

매뉴얼 페이지에는 두 모드가 모두 표시됩니다( -t모드를 제거했습니다).

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY

지정하지 않고 -T(Gnu mv에서만 가능하다고 생각함) 두 개의 인수가 있는 경우 구문이 모호하다는 것을 알 수 있습니다. 마지막 파일을 확인하면 모호성을 해결할 수 있습니다. 디렉터리인 경우 두 번째 형식이고, 그렇지 않은 경우 첫 번째 형식입니다. /디렉터리 이름을 추가하고 두 번째 형식을 적용하여 구문 을 명시적으로 만들 수 있습니다. 이렇게 하면 많은 오류를 방지할 수 있습니다. 불행하게도 첫 번째 형식을 명확하게 하는 유일한 방법은 -T.

관련 정보