디렉터리를 평면화할 수 있는 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 {} \;