>

Linux Script (Bash)를 만들어 파일을 파일 이름으로 패턴별로 정렬하려고합니다.

내 파일은 대부분 .JPG, 일부 .AV 및 .MP4입니다. 이 파일에는 태그가 손상되어 (RAID 충돌로 복원) 메타 태그를 사용할 수 없습니다.

내 파일의 대부분은이 Seaxxx_A01_xxx.jpg 또는 Beach_xxx_A01A02_xxx.jpg 또는 Mountain_xxx_A04A12_xxx.jpg와 같은 태그로되어 있습니다 (이것은 사진 및 장치를 촬영 한 사람에 대한 내 참조입니다 (예 : 카메라, 반사 등).

).

필요한 것은 파일 이름을 기준으로 파일을 올바른 폴더와 하위 폴더에 저장하는 것입니다.

이 작업을 다음과 같이 달성했다고 생각합니다 :

찾기를 사용하여 패턴 [AZ] [0-2] [0-6] 또는 [AZ] [0-2] [0-6] [AZ] [0-2] [0-6]을 찾으십시오. 이 패턴이 발견되면 첫 번째 파일 이름 부분을 찾으십시오 (예 : 바다, 해변, 산, 가족 등 ... 항상 첫 번째 단어로 배치됩니다. 일반적으로 이전에는 다른 것이 없습니다) 첫 번째 부분을 사용하여 비슷한 이름의 폴더를 찾아서 넣습니다 (파일에 Sea_Royan_xxx_A04A10_xxx.jpg가 있고 "Sea"라는 폴더 만있는 경우).

각 폴더에 A01, A02, A03, A04 또는 Dio, Sandy, Mael 등과 같은 하위 폴더가 있으며 현재 찾은 파일을 원합니다 (즉, 상위 폴더에 배치 된 파일과 동일) , 바다, 산 등 ...) 위에 나열된 두 번째 패턴이 올바른 하위 폴더에 있는지 확인하십시오.

실제로 더 간결하게 필요합니다 : 파일을 찾으면 파일 이름을 확인하고 두 가지 패턴을 사용하여 오른쪽 폴더와 하위 폴더로 이동하십시오.

내가 할 수있는 방법을 알려주십시오 (패턴을 기반으로 파일을 찾는 방법을 알고 있지만 현재 발견 된 파일 이름을 읽는 방법을 알지 못하고이 파일 이름에서 올바른 PATH로 사용할 두 패턴을 확인하십시오) 이 작업을 수행하는 가장 쉬운 방법이나 더 좋은 방법을 알려주세요.

  • 답변 # 1

    여기서 가장 아름답거나 독창적이지는 않은 한 가지 방법이 있습니다. 아이디어는 파일 이름에서 관련 비트를 추출하기 위해 awk에서 정규 표현식을 사용하는 것입니다. 그런 다음 awk에서 쉘 이동 (mv) 명령을 빌드합니다. 마지막으로 awk에서 사용 가능한 시스템 명령을 사용하여 명령을 실행하고 파일을 적절한 하위 폴더로 옮깁니다.

    자세한 설명을 얻으려면 먼저 시도하십시오 :

    find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd }'
    
    

    결과 :

    Command to be run:  mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
    Command to be run:  mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
    Command to be run:  mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02
    
    

    실제로 명령을 실행하려면 명령문 끝에 system (cmd)를 추가하십시오.

    find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'
    
    

    아마도 한 가지 원하는 것은 정규식을 필요에 맞게 조정하는 것입니다. 정규식에 익숙하다고 가정합니다. 여기서 파일 이름의 두 부분을 캡처하고 있습니다. 캡처 그룹은 괄호로 묶습니다.

    파일 이름의 시작 부분부터 시작하여 밑줄 하나를 찾을 때까지 밑줄이 아닌 모든 것을 가져옵니다. 그런 다음 패턴 A #####을 찾을 때까지 계속 찾습니다. 여기서 #은 문자/숫자를 나타냅니다 (두 번째 캡처 그룹). 다음 밑줄에 닿을 때까지 캡처합니다.

관련 자료

  • 이전 터미널 색상 이스케이프 시퀀스는 bash의 어디에나 정의되어 있습니까?
  • 다음 암호화 된 홈 디렉토리 및 SSH (키 전용 인증)로 X11 전달이 중단됨