중첩된 디렉터리를 평면화하는 스크립트

중첩된 디렉터리를 평면화하는 스크립트

디렉터리를 평면화할 수 있는 Bruno의 스크립트를 찾았습니다. 지정된(상위 수준) 디렉터리 내의 모든 디렉터리에서 작동하도록 루프로 실행하도록 이를 수정하는 방법을 알려줄 수 있는 사람이 있습니까?
미리 감사드립니다;)

# This scripts flattens the file directory
# Run this script with a folder as parameter:
# $ path/to/script path/to/folder

#!/bin/bash

rmEmptyDirs(){
    local DIR="$1"
    for dir in "$DIR"/*/
    do
        [ -d "${dir}" ] || continue # if not a directory, skip
        dir=${dir%*/}
        if [ "$(ls -A "$dir")" ]; then
            rmEmptyDirs "$dir"
        else
            rmdir "$dir"
        fi
    done }

flattenDir(){
    local DIR="$1"
    find "$DIR" -mindepth 2 -type f -exec mv -i '{}' "$DIR" ';' }

flattenDir "$1" rmEmptyDirs "$1" echo "Done"

답변1

단 한 줄만 있으면 모든 파일(하위 하위 디렉터리)이 pwd로 이동됩니다.

$ find  . -mindepth 2 -type f -exec mv {} .. \;

이렇게 하면 도트 파일(점으로 시작)을 포함한 모든 일반 파일이 이동되지만 링크는 이동되지 않습니다.

그런 다음 빈 디렉터리를 삭제합니다.

$ find . -type d -empty -delete

누락된 콘텐츠에는 이동되지 않은 링크(또는 다른 유형의 파일)가 포함되어 있습니다.

스크립트를 원하면 다음을 사용하십시오.

#!/bin/bash

fullpath=${1:-.}

( cd "$fullpath";
  find  . -mindepth 2 -type f -exec mv {} .. \;
  find . -type d -empty -delete
)

다음과 같이 스크립트를 호출합니다.script /the/path/you.want

답변2

특정 디렉터리 내에 있는 모든 디렉터리에 대해 특정 작업을 수행하는 한 가지 방법은 다음과 같습니다.

setopt -s nullglob
for e in SPECIFIED_DIRECTORY/*
do
  setopt -u nullglob
  [[ -d $e ]] && YOUR_SCRIPT "$e"
done

이름이 점으로 시작하는 디렉터리는 건너뜁니다. 이것은 일반적으로 우리가 원하는 것이지만 이러한 디렉토리도 포함하려는 경우 내 솔루션도 해당 경우에 맞게 조정할 수 있습니다. 매뉴얼 페이지의 옵션을 참조하고 특수 디렉토리 및 를 dotglob제외하는 것을 잊지 마십시오 ....

또 다른 가능성은 다음과 같은 것을 사용하는 것입니다.

find SPECIFIED_DIRECTORY -maxdepth 1 -type d -exec YOUR_SCRIPT {} \;

관련 정보