Bash - 배열에 없는 모든 파일을 찾는 방법

Bash - 배열에 없는 모든 파일을 찾는 방법

디렉토리에 많은 파일이 있고 그 안에 예상되는 파일 목록이 있습니다.

예: 내가 가지고 있는 파일은 다음과 같습니다.

  • 파일 1
  • 파일 2
  • 파일 3

예상되는 파일은

  • 파일 1
  • 파일 2
  • 파일 4

나는 디렉토리를 테스트하고 싶었고 file4가 디렉토리에 없다는 것을 발견했습니다.

답변1

파일 이름이 포함된 배열이 있고 디렉토리에 존재하지 않는 파일을 찾으려면 배열을 반복하여 파일이 존재하는지 확인하십시오. ( 모든 유형의 일반 파일 -f테스트 )-e

files=(file1 file2 file4)
for f in "${files[@]}" ; do 
    [ -f "$f" ] || echo "$f: not found"
done 

그 반대도 비슷하지만 이중 루프가 필요하거나 배열을 연관 배열로 전환해야 합니다. 이중 루프를 사용하십시오.

files=(file1 file2 file4)
for f in * ; do
        found=0
        for g in "${files[@]}" ; do
                [ "$f" = "$g" ] && found=1
        done
        [ "$found" = 0 ] && echo "$f: in directory but not listed"
done 

답변2

배열 결합 및 빼기의 경우 zsh대신 을 찾으십시오 bash.

$ expected=(file1 file2 file4)
$ existing=(file1 file2 file3) # or existing=(file*) to use globbing

$ echo missing: ${expected:|existing}
missing: file4
$ echo found: ${expected:*existing}
found: file1 file2
$ echo unexpected: ${existing:|expected}
unexpected: file3

니모닉(적어도 내 것, 공식인지는 확실하지 않음):

  • ${A:|B}: 포인트들$A 술집그것들$B
  • ${A:*B}: 포인트들$A 주연그것들 $B.

답변3

여러 파일을 테스트해야 한다면 함수가 더 나은 솔루션입니다. 그렇지 않으면 간단한 ls파일로 충분합니다! 찾고 있는 파일이 존재하지 않을 때 얻을 수 있는 출력은 다음과 같습니다.

../theDirIWantToCheck $ ls theFileIWantToFind.txt
ls: theFileIWantToFind.txt: No such file or directory

또한 탭 완성을 사용하는 것이 좋습니다. 명령을 실행 ls하고 원하는 파일 이름을 입력하기 시작하십시오. 몇 개의 문자를 입력하고 Tab 키를 누르기만 하면 됩니다(작동하지 않으면 Tab 키를 두 번 누르십시오). 패턴과 일치하는 모든 파일 이름을 표시합니다존재한다면.

$ ls fi<tab>
file1.txt file2.txt file3.txt file_new.txt filetypes.txt

ls여러 매개변수를 전달하여 여러 파일을 확인할 수도 있습니다 .

$ ls file1.txt file2.txt file3.txt
...

파일이 동일한 패턴 접두사(예: 위: file1, file2, file3)를 공유하는 경우 중괄호 확장을 사용할 수 있습니다. 이는 세 가지 매개변수를 모두 압축 형식으로 전달하는 것과 같습니다. ..범위를 나타냅니다 .

$ ls file{1..3}.txt
ls: file1.txt: No such file or directory
ls: file2.txt: No such file or directory
ls: file3.txt: No such file or directory

또는 와일드카드를 사용하여 공통 접두사 "file"(예: file1.txt, file_other.txt)이 있는 가능한 모든 일치 패턴을 전달할 수 있습니다.

$ ls file*
...

마지막 ls으로 echo.-lls​크기 및 마지막 수정 날짜/시간.

답변4

perl -le '-e or print for qw/file1 file2 file4/'

관련 정보