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