나는 약 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
그건:
- 모든 파일 이름을 반복합니다.
- 각 파일 이름이
grep
6자리 숫자로 시작하는지 확인하세요. - 그렇지 않은 경우 파일을 삭제하십시오.
- 그렇다면
grep
일치하는 숫자가 있는지 확인하십시오.numbersfile.txt
- 그렇지 않은 경우 파일을 삭제하십시오.
(삭제하기 전에 테스트하려면 다음 rm
으로 바꾸면 echo
삭제할 모든 파일 목록이 표시됩니다)