programing

셸 스크립트에서 디렉토리 내의 파일 목록을 가져오려면 어떻게 해야 합니까?

lastmoon 2023. 4. 17. 22:18
반응형

셸 스크립트에서 디렉토리 내의 파일 목록을 가져오려면 어떻게 해야 합니까?

셸 스크립트를 사용하여 디렉토리의 내용을 가져오려고 합니다.

대본은 다음과 같습니다.

for entry in `ls $search_dir`; do
    echo $entry
done

서 ''는$search_dir상대 경로입니다. ★★★★★★★★★★★★★★.$search_dir에는 이름에 공백이 있는 파일이 많이 포함되어 있습니다.이 경우 이 스크립트는 예상대로 실행되지 않습니다.

나도 알아for entry in *현재 디렉토리에서만 사용할 수 있습니다.

디렉토리로 할 수 있습니다.사용할 수 있습니다.for entry in *다시 바꿀 수는 있지만, 제 특정한 상황 때문에 그럴 수는 없어요.

에게는 두 인 길이 .$search_dir ★★★★★★★★★★★★★★★★★」$work_dir파일 작성/삭제 등의 작업을 동시에 수행해야 합니다.

그럼 이제 어떻게 하죠?

PS: 저는 bash를 사용합니다.

search_dir=/the/path/to/base/dir
for entry in "$search_dir"/*
do
  echo "$entry"
done

구문을 알기 쉽게 하는 방법은 다음과 같습니다.

yourfilenames=`ls ./*.txt`
for eachfile in $yourfilenames
do
   echo $eachfile
done

./할 수 .
*.txt
쉽게 할 수 .ls이치노

변수를 .yourfilenames되는 모든 이 개별후 list 명령어를 루프합니다.그러면 이 요소를 루프합니다. 변수인 ' 변수'를 합니다.eachfile이 경우 파일 이름이라는 단일 요소가 루프되는 변수를 포함합니다. 꼭 할 수 없지만,는 이미 으로 알 수 있습니다.ls"루프"의 경우 "루프"를 선택합니다.

여기 있는 다른 답변은 훌륭하고 당신의 질문에 대한 답변이지만, 이것은 파일 목록을 저장하기 위해 찾고 있던 "Bash get files in directory"(디렉토리에 있는 파일 목록 가져오기)에 대한 구글의 상위 결과이기 때문에 이 문제에 대한 답변을 게시하려고 합니다.

ls $search_path > filename.txt

특정 형식(예: .txt 파일)만 원하는 경우:

ls $search_path | grep *.txt > filename.txt

$search_path는 옵션입니다.ls > filename 입니다.txt는 현재 디렉토리를 수행합니다.

for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done
$ pwd; ls -l
/home/victoria/test
total 12
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  a
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  c
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'c d'
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  d
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_a
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'e; f'

$ find . -type f
./c
./b
./a
./d
./c d
./e; f

$ find . -type f | sed 's/^\.\///g' | sort
a
b
c
c d
d
e; f

$ find . -type f | sed 's/^\.\///g' | sort > tmp

$ cat tmp
a
b
c
c d
d
e; f

바리에이션

$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

주의:

  • . 폴더: 재재더 :폴
  • -maxdepth 1으로 찾다
  • -type f 파일 "Find files" )d)
  • -not -path '*/\.*'하지 않음 : " " ".hidden_files
  • sed 's/^\.\///g' 있는 것을 합니다../
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"

승인된 답변과 유사하지만 전체 경로가 아닌 파일 이름만 나열합니다.

조금 전에 답변이 끝난 것 같습니다만, 풀 패스가 아니고, 원하는 디렉토리에 파일을 리스트 하는 답변도 하고 싶다고 생각하고 있습니다.

    #search_dir=/the/path/to/base/dir/
    IFS=$'\n' #for in $() splits based on IFS
    search_dir="$(pwd)"
    for entry in $(ls $search_dir)
    do
        echo $entry
    done

또한 특정 파일을 필터링하려면grep -q★★★★★★ 。

    #search_dir=/the/path/to/base/dir/
    IFS=$'\n' #for in $() splits based on IFS
    search_dir="$(pwd)"
    for entry in $(ls $search_dir)
    do
        if grep -q "File should contain this entire string" <<< $entry; then
        echo "$entry"
        fi
    done

참고 자료:

IFS에 대한 자세한 내용은 여기를 참조하십시오.

셸에서 기판을 찾는 방법에 대한 자세한 내용은 여기를 참조하십시오.

에서는, 이러다」가 붙어 ..' do use'는 'To that use'입니다

for entry in "$search_dir"/* "$search_dir"/.[!.]* "$search_dir"/..?*
do
  echo "$entry"
done

셸 스크립트에서 디렉토리 내의 파일 목록을 가져오려면 어떻게 해야 합니까?

@Ignacio Vazquez-Abrams에 의해 가장 많이 인용된 답변과 더불어 다음 솔루션도 모두 사용할 수 있습니다.이 솔루션들은 무엇을 하고 싶은지에 따라 달라집니다.교환할 수 있습니다."path/to/some/dir".현재 디렉토리에서 검색하려면 , 다음의 순서에 따릅니다.

로 1. 을 하세요.find ★★★★★★★★★★★★★★★★★」ls

참고 자료:

  1. ★★★의 find, 이 을 참조해 주세요.제 코멘트도 참조해 주세요.
  2. ★★★의 lslinuxhandbook.com 를 참조해 주세요. Linux에서 디렉토리만 나열하는 방법

힌트: 다음 중 하나에 대해find을 "하다"로 수 .sort -V정리하고 싶다면요

예:

find . -maxdepth 1 -type f | sort -V

일반 파일만 나열(-type f 깊이 1레벨 깊이:

# General form
find "path/to/some/dir" -maxdepth 1 -type f

# In current directory
find . -maxdepth 1 -type f

심볼릭 링크만 표시(-type l 깊이 1레벨 깊이:

# General form
find "path/to/some/dir" -maxdepth 1 -type l

# In current directory
find . -maxdepth 1 -type l

디렉토리만 표시(-type d 깊이 1레벨 깊이:

「 」의 는, 을해 주세요.find예를 들어 '다 하다'라는 글도 .-mindepth 1의 디렉토리를하려면 , 「」를 참조해 주세요...그렇지 않으면 디렉토리 목록의 맨 위에 표시됩니다.여기를 참조해 주세요.이 / 현재 / 도트 폴더를 "type d" 검색에서 제외하는 방법

# General form
find "path/to/some/dir" -mindepth 1 -maxdepth 1 -type d

# In current directory
find . -mindepth 1 -maxdepth 1 -type d

# OR, using `ls`:
ls -d

위의 몇 가지를 조합합니다.일반 파일과 심볼릭 링크만 나열해 주세요.-type f,l 깊이 1레벨 깊이:

「」 「」)를합니다.,합니다.-type:

# General form
find "path/to/some/dir" -maxdepth 1 -type f,l

# In current directory
find . -maxdepth 1 -type f,l

는 줄 바꿈 문자(2. 줄 문자됩니다.\n)

★★★★★★★★★★★★★★.$search_dir에는 이름에 공백이 있는 파일이 많이 포함되어 있습니다.이 경우 이 스크립트는 예상대로 실행되지 않습니다.

이 문자를 기반으로 됩니다.\n 기본 Space char( 「 「 」 )가 .IFS(Internal Field Separator--「Bash Scripting 」의 의미」를 참조해 주세요.그러기 위해서는,mapfile명령어를 입력합니다.

라는 툴shellscript recomm recomm recomm 、 [ 。mapfile ★★★★★★★★★★★★★★★★★」read -rbash 배열로 새 줄 bash')에 따라 요소를 합니다.\nhttps://github.com/koalaman/shellcheck/wiki/SC2206 를 참조해 주세요.

" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""mapfile ★★★★★★★★★★★★★★★★★」read -r제 답변은 이쪽입니다.여러 줄 문자열을 일반 bash "인덱스화" 배열로 읽는 방법.지금은 대신 을 사용하는 것이 좋습니다.왜냐하면 빈 행은 어레이 내의 요소로 유지되지만, 불필요한 행은 모두 어레이 내의 요소로 유지되지 않기 때문입니다.

(원래 답변으로 돌아가기:)

다음으로 명령어를 사용하여 줄바꿈으로 구분된 문자열을 일반 bash "indexed" 배열로 변환하는 방법을 나타냅니다.

# Capture the output of `ls -1` into a regular bash "indexed" array.
# - includes both files AND directories!
mapfile -t allfilenames_array <<< "$(ls -1)"
# Capture the output of `find` into a regular bash "indexed" array
# - includes directories ONLY!
# Note: for other `-type` options, see `man find`.
mapfile -t dirnames_array \
    <<< "$(find . -mindepth 1 -maxdepth 1 -type d | sort -V)"

주의:

  1. 는 용용 we we we we we we we we wels -1은 각 파일명을 행( 「new line」, 「\n새카맣게 그을 클릭합니다.
  2. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★<<< 문자열.
  3. 것은, 을 참조하십시오.mapfile --help , 「」help mapfile)를 참조해 주세요.

풀 코드 예시:

file array_list_all_files_and_directorys에서.sh eRCaGuy_hello_world repo:

echo "Output of 'ls -1'"
echo "-----------------"
ls -1
echo ""

# Capture the output of `ls -1` into a regular bash "indexed" array.
# - includes both files AND directories!
mapfile -t allfilenames_array <<< "$(ls -1)"
# Capture the output of `find` into a regular bash "indexed" array
# - includes directories ONLY!
# Note: for other `-type` options, see `man find` and see my answer here:
# https://stackoverflow.com/a/71345102/4561887
mapfile -t dirnames_array \
    <<< "$(find . -mindepth 1 -maxdepth 1 -type d | sort -V)"

# Get the number of elements in each array
allfilenames_array_len="${#allfilenames_array[@]}"
dirnames_array_len="${#dirnames_array[@]}"

# 1. Now manually print all elements in each array

echo "All filenames (files AND dirs) (count = $allfilenames_array_len):"
for filename in "${allfilenames_array[@]}"; do
    echo "    $filename"
done
echo "Dirnames ONLY (count = $dirnames_array_len):"
for dirname in "${dirnames_array[@]}"; do
    # remove the `./` from the beginning of each dirname
    dirname="$(basename "$dirname")"
    echo "    $dirname"
done
echo ""

# OR, 2. manually print the index number followed by all elements in the array

echo "All filenames (files AND dirs) (count = $allfilenames_array_len):"
for i in "${!allfilenames_array[@]}"; do
    printf "  %3i: %s\n" "$i" "${allfilenames_array["$i"]}"
done
echo "Dirnames ONLY (count = $dirnames_array_len):"
for i in "${!dirnames_array[@]}"; do
    # remove the `./` from the beginning of each dirname
    dirname="$(basename "${dirnames_array["$i"]}")"
    printf "  %3i: %s\n" "$i" "$dirname"
done
echo ""

다음은 eRCaGuy_hello_world/python dir 내에서 실행되는 위의 코드 블록의 출력 예를 나타냅니다.

eRCaGuy_hello_world/python$ ../bash/array_list_all_files_and_directories.sh
Output of 'ls -1'
-----------------
autogenerate_c_or_cpp_code.py
autogenerated
auto_white_balance_img.py
enum_practice.py
raw_bytes_practice.py
slots_practice
socket_talk_to_ethernet_device.py
textwrap_practice_1.py
yaml_import

All filenames (files AND dirs) (count = 9):
    autogenerate_c_or_cpp_code.py
    autogenerated
    auto_white_balance_img.py
    enum_practice.py
    raw_bytes_practice.py
    slots_practice
    socket_talk_to_ethernet_device.py
    textwrap_practice_1.py
    yaml_import
Dirnames ONLY (count = 3):
    autogenerated
    slots_practice
    yaml_import

All filenames (files AND dirs) (count = 9):
    0: autogenerate_c_or_cpp_code.py
    1: autogenerated
    2: auto_white_balance_img.py
    3: enum_practice.py
    4: raw_bytes_practice.py
    5: slots_practice
    6: socket_talk_to_ethernet_device.py
    7: textwrap_practice_1.py
    8: yaml_import
Dirnames ONLY (count = 3):
    0: autogenerated
    1: slots_practice
    2: yaml_import

디렉토리내의 파일을 일람 표시하는 다른 방법이 있습니다(다른 툴을 사용하고, 다른 응답에 비해 효율적이지 않습니다).

cd "search_dir"
for [ z in `echo *` ]; do
    echo "$z"
done

echo *현재 디렉토리의 모든 파일을 출력합니다.for스투우트

는, 「 」, 「 」, 「 」, 「 」의 내부에 배치합니다.for 디세이블로그:

if [ test -d $z ]; then
    echo "$z is a directory"
fi

test -d는 파일이 디렉토리인지 여부를 확인합니다.

ls $search_path ./* |grep ".txt"|
while IFS= read -r line
do 
   echo "$line"
done

언급URL : https://stackoverflow.com/questions/2437452/how-to-get-the-list-of-files-in-a-directory-in-a-shell-script

반응형