라는 디렉토리가 있습니다 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
.