6자리 숫자로 시작하고 목록의 숫자와 일치하는 파일을 찾습니다.

6자리 숫자로 시작하고 목록의 숫자와 일치하는 파일을 찾습니다.

나는 약 185,000개의 파일로 구성된 거대한 컬렉션을 가지고 있는데, 그 중 99%는 6자리 숫자로 시작하고 그 뒤에 밑줄과 기타 임의의 기호 및 임의의 확장자가 옵니다.

 312095_ck_image-24-10-20-11-29-1.jpeg
 312095_ck_image-24-10-20-11-29-2.jpeg
  312095_ck_image-24-10-20-11-29.jpeg

기본적으로 이 6자리 숫자는 사용자 ID(일부 백엔드 Oracle 데이터베이스에서 제공)이며
각 사용자 ID는 디렉토리에 여러 번 나타날 수 있습니다. 또한 한 줄에 6자리 숫자(약 18,000개)가 포함된 텍스트 파일도 있습니다. 파일 디렉터리를 텍스트 파일의 내용과 일치시키는 것이 가능합니까? 따라서 파일이 텍스트 파일의 숫자로 시작하는 경우 나중에 폴더를 삭제할 수 있도록 파일을 다른 디렉터리(나머지 이름이나 확장자에 관계없이)로 옮기고 싶습니다. 각 개별 파일 대신 전체 폴더를 삭제할 수 있도록 폴더에 일치하는 모든 파일을 원합니다. 이것이 Linux에서 가능합니까(셸에서 또는 소스에서 다른 Linux 프로그램을 설치/빌드하여). 운영 체제 버전은 RHEL Linux 6입니다. 이것이 더 쉬워지면 디렉터리의 파일 목록을 데이터베이스 테이블에 로드하고 이를 텍스트 파일의 숫자 목록과 일치시켜 어떤 파일 이름이 제거/이동되는지 정확히 알 수 있습니다. 파일을 이동/삭제할 수 있도록 해당 목록을 mv 명령에 공급하는 방법을 모르겠습니다. 이를 구현하는 가장 쉬운 방법은 무엇입니까? 따라서 내 실제 폴더가 있고 /new_upload/entrants/참가자와 동일한 수준에 정크라는 빈 폴더가 있고 /new upload/junk 실행하려는 ID 목록에 312095가 나타나는 경우

mv 312095_*   /new_upload/junk 

[idis] entrants# sh -h
sh-4.1# 
[idis] entrants# $SHELL --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 

답변1

GNU 시스템에서는 다음을 수행할 수 있습니다.

find . -type f -print0 |
  LC_ALL=C gawk -F/ '
    !list_processed {user[$0]; next}
    match($NF, /^([0-9]{6})_/, f) && f[1] in user
    ' user-list.txt list_processed=1 RS='\0' ORS='\0' - |
  xargs -r0 mv -it /where/to/move/them --

답변2

GNU가 있으므로 bash쉘 구성과 GNU를 사용하는 것은 간단합니다 grep.

#!/bin/bash

for file in *; do
  match=$(echo "${file}" | grep -o '^[[:digit:]]\{6\}')
  if [[ -z "${match}" ]] ;  then
    # File did not start with 6 digits, delete
    rm -- "${file}"
  else
    grep -q -F ${match} numbersfile.txt || rm -- "${file}"
  fi
done

그건:

  • 모든 파일 이름을 반복합니다.
  • 각 파일 이름이 grep6자리 숫자로 시작하는지 확인하세요.
  • 그렇지 않은 경우 파일을 삭제하십시오.
  • 그렇다면 grep일치하는 숫자가 있는지 확인하십시오.numbersfile.txt
  • 그렇지 않은 경우 파일을 삭제하십시오.

(삭제하기 전에 테스트하려면 다음 rm으로 바꾸면 echo삭제할 모든 파일 목록이 표시됩니다)

관련 정보