셸 스크립트에서 디렉토리 내의 파일 목록을 가져오려면 어떻게 해야 합니까?
셸 스크립트를 사용하여 디렉토리의 내용을 가져오려고 합니다.
대본은 다음과 같습니다.
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
참고 자료:
- ★★★의
find
, 이 답을 참조해 주세요.제 코멘트도 참조해 주세요. - ★★★의
ls
linuxhandbook.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 -r
bash 배열로 새 줄 bash')에 따라 요소를 합니다.\n
https://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)"
주의:
- 는 용용 we we we we we we we we we
ls -1
은 각 파일명을 행( 「new line」, 「\n
새카맣게 그을 클릭합니다. - ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
<<<
문자열. - 것은, 을 참조하십시오.
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
'programing' 카테고리의 다른 글
WPF MVVM: 창을 닫는 방법 (0) | 2023.04.22 |
---|---|
"find" 명령어 결과를 Bash에 배열로 저장하려면 어떻게 해야 합니다. (0) | 2023.04.22 |
git에서 삭제된 파일의 스테이징 해제 (0) | 2023.04.17 |
스타일을 통해 이벤트 기능을 설정하려면 어떻게 해야 합니까? (0) | 2023.04.17 |
유닉스 명령어 "watch"를 사용한 색상 (0) | 2023.04.17 |