![디렉토리에서 누락된 모든 파일의 쉼표로 구분된 색인 목록을 어떻게 추출할 수 있습니까?](https://linux55.com/image/135784/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%EC%84%9C%20%EB%88%84%EB%9D%BD%EB%90%9C%20%EB%AA%A8%EB%93%A0%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%89%BC%ED%91%9C%EB%A1%9C%20%EA%B5%AC%EB%B6%84%EB%90%9C%20%EC%83%89%EC%9D%B8%20%EB%AA%A9%EB%A1%9D%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%B6%94%EC%B6%9C%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
/mydir
현재 1000개의 양식 데이터 파일을 포함해야 하는 디렉토리가 있습니다 File1.exe, File2.exe, ... , File100.exe
.
현재 누락된 파일을 검색하고 출력하는 for 루프가 있습니다.
for((i=1; i<=1000; i++))
do
name="File.${i}.exe"; [[ ! -e "$name" ]] && echo "$i"
done
누락된 인덱스를 에코하지 않고 다음과 같이 쉼표로 구분된 목록에 넣을 수 있는 방법이 있는지 궁금합니다.
1,5,20,40,etc
.
이를 수행할 수 있는 방법이 있습니까?
답변1
쉼표로 구분된 문자열의 경우 계속해서 파일 인덱스를 변수에 추가하고 변수를 인쇄하십시오.
for((i=1; i<=30; i++))
do
name="File${i}.exe"; [[ ! -e "$name" ]] && files="$files$i,"
done
echo $files | sed s/,$//
또는 배열/목록에 값을 저장할 수 있습니다
arr=()
for((i=1; i<=30; i++))
do
name="File${i}.exe"; [[ ! -e "$name" ]] && arr+=($i)
done
(IFS=, ; echo "${arr[*]}") #to print the array with comma as separator
답변2
/bin/sh
누락된 파일의 이름을 저장하려면 위치 인수 목록을 사용하십시오 .
set --
i=1
while [ "$i" -le 1000 ]; do
name="File.$i.exe"
[[ ! -e "$name" ]] && set -- "$@" "$name"
i=$(( i + 1 ))
done
( IFS=','; printf 'Missing files: %s\n' "$*" )
또는 bash
배열을 사용하십시오.
missing=()
for (( i=1; i<=1000; ++i )); do
name="File.$i.exe"
[[ ! -e "$name" ]] && missing+=( "$name" )
done
( IFS=','; printf 'Missing files: %s\n' "${missing[*]}" )
"$*"
or 를 사용하면 "${missing[*]}"
배열이 문자열로 변환됩니다. 문자열은 $IFS
구분 기호로 첫 번째 문자와 연결됩니다(기본값은 공백). 서브쉘은 IFS
쉼표로 설정된 다음 쉼표로 연결된 배열을 인쇄합니다. 서브쉘은 IFS
스크립트의 나머지 부분에서 변수가 설정되는 것을 방지합니다.
코드는 공백 등이 포함된 파일 이름도 처리할 수 있습니다.
답변3
paste
도구를 사용하여 | paste -sd,
루프에 추가하면 됩니다.
for((i=1; i<=1000; i++))
do
name="File.${i}.exe"; [[ ! -e "$name" ]] && echo "$i"
done | paste -sd,
설명하다:
붙여넣기 - 파일 줄 병합
FILE 없이 [OPTION]... [FILE]...을 붙여넣거나
FILE이 -인 경우 표준 입력을 읽습니다.
-s
:병렬이 아닌 한 번에 하나의 파일을 붙여넣습니다.-d
: 구분 기호(,
이 예에서는)