하나의 하위 폴더를 제외하고 모두 해당 하위 폴더로 이동

하나의 하위 폴더를 제외하고 모두 해당 하위 폴더로 이동

라는 디렉토리가 있습니다 temp. 이 폴더에는 여러 개의 하위 폴더가 있습니다(정확한 수는 모르겠습니다). 이제 temp이름이 붙은 안에 또 다른 하위 폴더를 만듭니다 Untitled. 이제 다른 모든 하위 폴더를 Untitled.

임시 폴더에 a, b, c라는 3개의 폴더가 있다고 가정합니다. 이제 Untitled임시에는 a, b, c 및 Untitled 4개의 폴더가 포함됩니다. 작업을 실행한 후 temp에는 Untitled 폴더만 포함되며, Untitled에는 a, b, c가 포함됩니다.

Bash를 사용하여 어떻게 이를 달성할 수 있나요?

내 Bash 버전(Ubuntu 16.04)

GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

답변1

간단히 말해서 오류 없이 bash의 확장 와일드카드를 사용하여 생략하려는 디렉터리 하나를 제외할 수 있습니다.

shopt -s extglob
mv -- !(Untitled) Untitled

확장된 와일드카드가 켜져 있으면 mv첫 번째 인수( !(Untitled))를 현재 디렉터리의 모든 파일과 디렉터리로 확장하여 명령이 작동하는지 확인하세요.와는 별개로'무제'라는 작품입니다. 그러면 이러한 모든 파일과 디렉터리가 Untitled이 디렉터리로 이동됩니다 .

그냥 움직이고 싶다면목차현재 디렉터리에서 Untitled로 이동하여 문자를 추가합니다.

shopt -s extglob
mv -- !(Untitled)/ Untitled

...tail은 /bash가 파일 대신 디렉터리와 일치하도록 강제합니다.

.subdir위의 내용은 기본적으로 도트 파일(예: )을 생략합니다 . 이것도 선택하려면 다음을 추가하세요.

shopt -s dotglob

이러한 셸 옵션에 대한 자세한 내용은 다음을 참조하세요.

답변2

홈 폴더에 폴더만 있다고 가정할 때 가장 쉬운 방법은 temp(첫 번째 cd부터 temp)입니다.

mv * Untitled

다음과 같은 오류가 발생합니다.

mv: cannot move 'Untitled' to a subdirectory of itself, 'Untitled/Untitled'

이것이 문제가 되는 경우 루프를 사용하여 *대상 하위 폴더를 건너뛰고 각 파일을 하나씩 이동할 수 있습니다.

$ mkdir a b c
$ target_dir=Untitled
$ mkdir "$target_dir"
$ for f in *; do
if [ "$target_dir" == "$f" ]; then continue; fi; mv "$f" "$target_dir"; done
$ ls
Untitled
$ ls Untitled/
a  b  c

건너뛰고 싶은 파일이 있으면 루프 내부에 명령 앞에 조건을 추가하세요 mv.

관련 정보