각 하위 디렉터리의 파일 이름을 해당 하위 디렉터리의 텍스트 파일로 수집하려면 어떻게 해야 합니까?

각 하위 디렉터리의 파일 이름을 해당 하위 디렉터리의 텍스트 파일로 수집하려면 어떻게 해야 합니까?

각 하위 디렉터리의 모든 파일 이름을 해당 하위 디렉터리의 텍스트 파일에 저장하고 싶어서 다음 스크립트를 작성했습니다.

#!/bin/bash
for X in "$PWD" *
do  
    if [ -d "$X" ];
    then
        cd "$X"
        files="$(ls)"
        echo "$files" >> filesNames.txt
    fi
done

그러나 다음을 사용하여 하위 디렉터리에 들어갈 수 없습니다.

cd "$X"

여기에 문제가 있나요?

답변1

귀하의 의견에 따르면 한 단계 더 깊이 들어가시면 됩니다. 이 경우 glob을 사용하여 디렉터리 이름을 반복하고 각 디렉터리의 배열에 파일 경로를 저장한 다음 각 경로의 마지막 요소를 다음에 인쇄할 수 있습니다 fileNames.txt.

#!/bin/sh

for dir in "$PWD"/*/; do
arr=( "$dir"* )
printf %s\\n "${arr[@]##*/}" > "$dir"filesNames.txt
done

심볼릭 링크를 제외하려면 다음과 같은 조건을 추가하면 됩니다.if [[ ! -L "${dir%?}" ]]; then arr...

답변2

cd다음 디렉토리를 시도하기 전에 각 하위 디렉토리를 종료 해야 합니다 . 끼워 넣다...

cd ..

이는 루프가 끝날 때 하위 디렉터리에 대해 수정되지만 최상위 디렉터리에서 먼저 수행하면 중단됩니다. 여기서 시작하면 cd ..다른 레벨로 이동하여 다른 디렉토리가 더 이상 표시되지 않습니다.

최상위 디렉터리를 변수에 저장하고 cd매번 변수에 저장하면 이러한 모든 문제를 해결할 수 있습니다.

#!/bin/bash

TOPDIR="$PWD"
for X in "$PWD" * ; 
do
        if [ -d "$X" ] ;
        then
                cd "$X"
                files="$(ls)"
                echo "$files" >> filesNames.txt
                cd "$TOPDIR"
        fi
done

이전 실행의 모든 ​​결과를 유지하지 않으려면 으로 변경할 수도 있습니다 >>.>

답변3

#!/bin/bash
for X in $PWD/* ; do
        if [ -d "$X" ] ; then # first depth directories
                cd "$X" ;
                files="$(ls)" ;
                printf "$files\n" >> filesNames.txt ;
        else # regular files:
                printf "$X\n" >> fileNames.txt ;
        fi ;
done ;

달성하려는 작업은 다음을 사용하여 가능할 수 있습니다. find각 옵션에 대해 추가 옵션( )을 사용하세요. 예를 들면 다음과 같습니다.man find$X

files=$(find ${PWD} -type f) ;
printf "$files\n" >> filesNames.txt ;

답변4

이 시도:

find . -type d -exec sh -c "cd {} ; ls | grep -v '^filesNames.txt$' > filesNames.txt" \;

이는 현재 디렉토리 아래의 모든 디렉토리를 찾고, 각 디렉토리에 대해 cd해당 디렉토리로 이동하여 디렉토리 목록을 a에 기록합니다 filesNames.txt(목록에서 파일 제외).

filesNames.txt이러한 파일도 목록에 표시 하려면 | grep -v ...다음 명령에서 해당 파일을 제거하세요.

find . -type d -exec sh -c "cd {} ; ls > filesNames.txt" \;

관련 정보