어떤 디렉토리에도 중복된 파일 이름이 없도록 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_file6
sample_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
먼저, 명령의 디렉터리를 우선순위에 따라 나열하는 것이 중요합니다. 나는 당신이 이것을 했다는 것을 봅니다.
-F/
이는 awk에게
/
필드 구분 기호로 사용하도록 지시합니다. 이는 파일 이름이 마지막 필드가 됨을 의미합니다$NF
.f=$NF; sub(/\.Z$/,"",f)
그러면 변수에 파일 이름이 할당되고
f
최종 파일 이름이 있으면 제거.Z
됩니다f
.!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