디렉토리에서 누락된 모든 파일의 쉼표로 구분된 색인 목록을 어떻게 추출할 수 있습니까?

디렉토리에서 누락된 모든 파일의 쉼표로 구분된 색인 목록을 어떻게 추출할 수 있습니까?

/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: 구분 기호( ,이 예에서는)

관련 정보