내 디렉토리에 일부 파일과 디렉토리가 있습니다 /var/foo/bar/baz
. 이제 나는 그것들을 모두 로 옮기고 /var/foo/bar
baz를 제거하고 싶습니다 . 쉽지요?
cd /var/foo/bar
mv baz/* .
rmdir baz
(논의를 위해 .로 시작하는 파일은 무시합니다.)
하지만! baz/
이름이 디렉터리가 아닌 파일을 포함 하면 어떻게 되나요 baz
? 다른 곳으로 옮길 수도 있고, 임시 파일 이름을 사용하여 디렉터리를 삭제 baz
하고 제자리로 옮길 수도 있습니다. 하지만 이것은 지루하고 명령이 많습니다... 또 다른 관례적이고 단순하고 우아한 방법이 있습니까?
노트:
- 다른 이름 충돌이 있는 경우
mv
재정의(및 힌트 제공)의 일반적인 의미는 괜찮습니다. 하지만 의 경우에는baz
그렇게 하지 않고 실패할 뿐입니다.
답변1
cd /var/foo/bar/baz
for src in *; do
dest="${src}"
suffix=0
while [[ -e ../"${dest}" ]]; do
dest="${src}.${suffix}"
suffix=$((suffix+1))
done
mv -n "$src" ../"$dest"
done
cd ..
rmdir baz
상당히 간단한 솔루션입니다. 현재 디렉터리에서 상위 디렉터리로 파일을 이동할 준비를 합니다. 해당 이름의 파일이 이미 존재하는 경우 숫자와 함께 접미사를 추가합니다. 단, 다음 번호는 사용하지 마세요.반품어떤 이유에서인지 이미 거기에 있습니다.
이 구성은 디렉터리, 소켓, 일반 파일 또는 존재할 수 있는 다른 모든 것이 호출된 항목이 존재하는 경우 [[ -e file ]]
true를 반환합니다 .file
답변2
너무 길지만 다음과 같이 작동합니다.
cd /var/foo/bar
bazbaz_tmp_file=$(mktemp baz/XXXXXXXXXXXXXX)
[[ -e baz/baz ]] && mv baz/baz $bazbaz_tmp_file
mv baz/* .
rmdir baz
mv $(basename $bazbaz_tmp_file) baz
참고: 이는 에서 다른 파일을 안전하게 이동할 수 있다고 가정합니다 baz/
.