텍스트 처리 - 다른 디렉터리의 중복된 파일 이름을 사용하여 검색 결과를 고유하게 정렬하는 방법은 무엇입니까?

텍스트 처리 - 다른 디렉터리의 중복된 파일 이름을 사용하여 검색 결과를 고유하게 정렬하는 방법은 무엇입니까?

어떤 디렉토리에도 중복된 파일 이름이 없도록 find 명령의 출력을 고유하게 정렬하고 싶습니다.

find /path/to/first_directory/* /path/to/second_directory/* /path/to/third_directory/* -mtime -1 -name "filename_pattern*"

예제 출력:

/path/to/first_directory/sample_file1_2017Dec25.dat
/path/to/first_directory/sample_file2_2017Nov01.dat
/path/to/first_directory/sample_file3_2017Oct08.dat
/path/to/first_directory/archive/sample_file1_2017Dec25.dat.Z
/path/to/first_directory/archive/sample_file2_2017Nov01.dat.Z
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file1_2017Dec25.dat
/path/to/third_directory/sample_file2_2017Nov01.dat
/path/to/third_directory/sample_file3_2017Oct08.dat
/path/to/third_directory/sample_file4_2017Sep11.dat
/path/to/third_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file6_2017July04.dat
/path/to/third_directory/sample_file6_2017June12.dat
/path/to/third_directory/sample_file7_2017May01.dat

출력에서 /first_directory/와 에 중복된 파일 이름이 있고 /first_directory/archive/과 의 모든 파일 도 그 안에 /first_directory/*있음을 알 수 있습니다 . 이는 이 디렉토리가 에서 발견된 모든 파일의 아카이브 디렉토리라는 것을 의미하지만 (체크섬)에서만 찾을 수 있는 파일도 있다는 것을 의미합니다./second_directory/*/third_directory/*/third_directory/*/first_directory/*/second_directory/*/third_directory/*sample_file6sample_file7

내가 인쇄하고 싶은 것은 파일을 이 순서 /first_directory/대로 , 중복 없이 날짜별로 정렬하는 것뿐입니다./first_directory/archive//second_directory//third_directory/

원하는 출력:

/path/to/first_directory/sample_file1_2017Dec25.dat
/path/to/first_directory/sample_file2_2017Nov01.dat
/path/to/first_directory/sample_file3_2017Oct08.dat
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file6_2017July04.dat
/path/to/third_directory/sample_file6_2017June12.dat
/path/to/third_directory/sample_file7_2017May01.dat

답변1

find 명령의 출력이 이름의 파일에 저장되어 있으면 filelist다음을 시도하십시오.

$ awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++' filelist
/path/to/first_directory/sample_file1_2017Dec25.dat
/path/to/first_directory/sample_file2_2017Nov01.dat
/path/to/first_directory/sample_file3_2017Oct08.dat
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file6_2017July04.dat
/path/to/third_directory/sample_file6_2017June12.dat
/path/to/third_directory/sample_file7_2017May01.dat

파일을 생성하지 않고 동일한 작업을 수행하려면 다음을 수행하십시오.

find /path/to/first_directory/* /path/to/second_directory/* /path/to/third_directory/* -mtime -1 -name "filename_pattern*" | awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++'

또는 명령을 여러 줄에 분산시키려면 다음을 사용하세요.

find /path/to/first_directory/* /path/to/second_directory/* \
  /path/to/third_directory/* -mtime -1 -name "filename_pattern*" |
    awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++'

\bash의 줄 연속 문자이기 때문에 첫 번째 줄 끝에 추가합니다 . 두 번째 줄은 로 끝나기 때문에 |줄 연속 문자가 필요하지 않습니다.

어떻게 작동하나요?

find먼저, 명령의 디렉터리를 우선순위에 따라 나열하는 것이 중요합니다. 나는 당신이 이것을 했다는 것을 봅니다.

  1. -F/

    이는 awk에게 /필드 구분 기호로 사용하도록 지시합니다. 이는 파일 이름이 마지막 필드가 됨을 의미합니다 $NF.

  2. f=$NF; sub(/\.Z$/,"",f)

    그러면 변수에 파일 이름이 할당되고 f최종 파일 이름이 있으면 제거 .Z됩니다 f.

  3. !a[f]++'

    f이전에 본 적이 없다면 이 줄을 인쇄하세요 .

업데이트 1: 다른 확장 기능 제거

의견에 따르면 .Z이 확장 프로그램은 제거해야 할 유일한 확장 프로그램이 아닙니다. 다른 확장자가 있을 수 있으며 .dat.edi이 경우 .dat.bak간단히 ..dat

awk -F/ '{f=$NF; sub(/\.dat.*/,".dat",f)} !a[f]++' filelist

업데이트 2: 타임스탬프별로 정렬된 파일 표시:

awk -F/ '{f=$NF; sub(/\.dat.*/,".dat",f)} !a[f]++' filelist | xargs -d'\n' -r ls -t

관련 정보