저는 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
.