각 하위 디렉터리의 파일 이름을 해당 하위 디렉터리의 텍스트 파일로 수집하는 방법은 무엇입니까?

각 하위 디렉터리의 파일 이름을 해당 하위 디렉터리의 텍스트 파일로 수집하는 방법은 무엇입니까?

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

#!/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" \;

관련 정보