각 하위 디렉터리의 모든 파일 이름을 해당 하위 디렉터리의 텍스트 파일에 저장하고 싶어서 다음 스크립트를 작성했습니다.
#!/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" \;