하위 디렉터리 이름을 구문 분석하려고 하는데 출력 결과에서 이름이 개별 단어로 구분됩니다.
예를 들어. 하위 디렉터리 이름이 "Hello World"인 경우 출력은 다음과 같습니다.
.
Hello
World
다음 코드는 작동하지만 출력에는 원하지 않는 현재 디렉터리가 포함됩니다.
find "$my_dir" -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir;
do
echo "$dir";
done
출력에서 현재 디렉터리를 제거하는 if 문을 포함하려고 했지만 코드에는 여전히 각 하위 디렉터리 이름에 대해 별도의 단어가 표시되는 것 같습니다.
find "$my_dir" -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir;
do
if ["$dir" != "."]; then
echo "$dir"
fi
done
답변1
공백으로 인한 중단은 read
명령에서 발생하지만 어쨌든 그렇게 할 필요는 없습니다. 또한 논리에 문제가 있습니다 if
. my_dir
같음 인 경우에만 작동하고 .
, 그렇지 않으면 출력에 a 를 생성 find
하지 않습니다 . .
마지막으로, 예제에서는 전체 경로가 아닌 디렉토리 이름만 원한다고 명시하고 작성한 방식대로 find
경로가 표준 출력으로 전달됩니다.
더 간단한 해결책은 다음과 같습니다.
find "$my_dir" -maxdepth 1 -type d -exec basename {} \;|tail -n +2
여기서 비결은 tail
명령입니다. $my_dir
출력에서 시작 디렉터리( )를 제외 하려고 합니다 . find
이 디렉터리는 항상 먼저 출력되므로(깊이 우선 순회를 명시적으로 요청하지 않는 한) 결과 출력에서 첫 번째 줄만 제거하면 됩니다.
답변2
그렇다면 -mindepth
여기에서 트리의 최상위 디렉터리를 제외하는 데 사용할 수 있는 이 옵션을 사용하세요.
find "$my_dir" -mindepth 1 -maxdepth 1 -type d -print0
-maxdepth
그러나 깊이 도 제한하고 있으므로 for
루프를 사용하는 것은 어떻습니까?
for dir in "$my_dir"/*
do
[[ -d "$dir" ]] || continue # only directories
echo "${dir/*\/}" # just basename
done