나는 주어진 디렉토리 구조를 평면화할 수 있는 쉘 스크립트를 찾고 있지만, 디렉토리에 하위 폴더가 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
.