bash 스크립트 - 디렉터리 구조 평면화

bash 스크립트 - 디렉터리 구조 평면화

나는 주어진 디렉토리 구조를 평면화할 수 있는 쉘 스크립트를 찾고 있지만, 디렉토리에 하위 폴더가 1개만 있는 경우에만 가능합니다. 예: 이 스크립트는 이 폴더를 평면화합니다.

/folder
    /subfolder
        file1
        file2

입력하다:

/folder
    file1
    file2

하지만 이 폴더는 건너뛰게 됩니다(아무 작업도 하지 않음).

/folder
    /subfolder1
    /subfolder2 

미리 감사드립니다.

스티브

답변1

다소 순진한 접근 방식:

#!/bin/sh

for dir do

    # get list of directories under the directory $dir
    set -- "$dir"/*/

    # if there are more than one, continue with the next directory
    # also continue if we didn't match anything useful
    if [ "$#" -gt 1 ] || [ ! -d "$1" ]; then
        continue
    fi

    # the pathname of the subdirectory is now in $1

    # move everything from beneath the subdirectory to $dir
    # (this will skip hidden files)
    mv "$1"/* "$dir"

    # remove the subdirectory
    # (this will fail if there were hidden files)
    rmdir "$1"

done

사용 bash:

#!/bin/bash

for dir do

    # get list of directories under the directory $dir
    subdirs=( "$dir"/*/ )

    # if there are more than one, continue with the next directory
    # also continue if we didn't match anything useful
    if [ "${#subdirs[@]}" -gt 1 ] || [ ! -d "${subdirs[0]}" ]; then
        continue
    fi

    # the pathname of the subdirectory is now in ${subdirs[0]}

    # move everything from beneath the subdirectory to $dir
    # (this will skip hidden files)
    mv "{subdirs[0]}"/* "$dir"

    # remove the subdirectory
    # (this will fail if there were hidden files)
    rmdir "${subdirs[0]}"

done

두 스크립트 모두 다음과 같이 실행됩니다.

$ ./script.sh dir1 dir2 dir3

또는

$ ./script.sh */

현재 디렉터리의 모든 디렉터리에서 실행합니다.

코드의 경고 외에도 심볼릭 링크를 다시 연결하지 못합니다. 이렇게 하려면 파일 시스템에서 가능한 모든 위치를 탐색 /folder하고 하위 하위 디렉터리에 대한 링크를 찾아 올바른 새 위치를 가리키도록 해당 링크를 다시 만들어야 합니다. 여기서는 코드에 대해 그렇게 깊이 다루지 않겠습니다.

또한 하위 디렉토리에서 콘텐츠를 이동할 때 동일한 이름의 항목이 아래에 존재하지 않는지 확인하는 검사가 없습니다 /folder.

관련 정보