내 쉘 스크립트가 내 홈 디렉토리 내의 모든 하위 디렉토리에 액세스할 수 있기를 원합니다. 디렉터리에서 일부 작업을 수행하고 출력을 스풀 파일로 보낸 후 다음 디렉터리로 이동합니다. 기본 디렉터리 = /tmp 하위 디렉터리 = ABCD(하위 디렉터리 4개)를 고려하세요.
답변1
for
루프를 사용하십시오 .
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
해당 디렉토리의 하위 디렉토리만 검색합니다 /path/to/dir
. 디렉터리 이름에 공백이나 특수 문자가 포함되어 있으면 위의 간단한 예가 실패합니다. 더 안전한 접근 방식은 다음과 같습니다.
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
아니면 간단하게 bash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(반대로 find
디렉토리에 대한 심볼릭 링크도 고려하고 숨겨진 심볼릭 링크는 제외합니다.)
답변2
저는 완전 bash
초보자이지만 UN*X 베테랑입니다. Bash 쉘 스크립트에서 이 작업을 수행할 수 있다는 데는 의심의 여지가 없지만 find [-maxdepth <levels>] <start-dir> -exec <command> ;
과거에는 그렇게 했습니다. 누군가가 방법을 알려줄 때까지 하나 만들어서 man find
시도해 볼 수도 있습니다 bash
!
답변3
각 하위 디렉터리 아래의 파일 이름이 충분하지 않은 것 같습니다. ls -l | awk
해당 파일 이름에 공백 및/또는 개행 문자가 포함되어 있으면 어떻게 됩니까? 우연히 일하지 않는 사람들에게도 다음이 find
적용됩니다.find
-maxdepth
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
답변4
나는 해결책을 얻었다. 아래의 find 명령은 내 요구 사항을 충족합니다.
find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep `date +"%m%d%Y"`|xargs echo" \;