파일 이름에서 가장 높은 숫자로 파일 정렬

파일 이름에서 가장 높은 숫자로 파일 정렬

다음과 같은 이름의 파일이 많이 있습니다.

name_file-1.txt
name_file-2.txt
name_file-3.txt
some_other_file-1.txt
some_other_file-2.txt

수천 개의 서로 다른 파일 이름이 있으며 일부는 -1.txt끝에 하나만 있고 일부는 -1.txt, -2.txt...-60.txt

각 파일의 가장 높은 번호를 복사해야 하므로 name_file-3.txt, some_other_file-2.txt. Linux 명령줄에서 이 작업을 어떻게 수행합니까?

답변1

와 함께 zsh:

typeset -A greatest
for f (*-*(n)) greatest[${f%-*}]=$f
cp -- $greatest /destination
  • *-*(n): 이름에 -( *-*)가 포함되어 있고 숫자로 정렬된 숨김되지 않은 파일( (n)glob 한정자)입니다.
  • ${f%-*}: 파일 이름의 일부를 가장 오른쪽까지 -(또는 없는 경우 끝까지 -).
  • $greatest: 비어 있지 않은 항목으로 확장됩니다.가치연관 배열의 따라서 여기서는 동일한 루트를 공유하는 파일의 경우 가장 큰 번호의 파일만 확장됩니다.

답변2

files=(*)
mapfile -t prefixes < <(printf "%s\n" "${files[@]%-*}" | sort -u)
for p in "${prefixes[@]}"; do ls -v "$p"* | tail -1; done
name_file-3.txt
some_other_file-2.txt

그런 다음 이를 다른 디렉토리에 복사하려면 다음을 수행하십시오.

for ...; done | xargs cp -t /destination/directory

답변3

파일이 현재 작업 디렉터리에 있고 해당 이름이 샘플과 일치하는 경우(숫자 앞에 단일 대시가 있음) 다음 POSIX 호환 파이프라인이 작동합니다.

ls | sort -t- -k1,1 -k2,2rn | awk -F- 'k!=$1 {print; k=$1}' | pax -rw /path/to/dir

정렬의 -u 옵션이 안정적인 경우 awk 구성 요소는 정렬 -u로 대체될 수 있습니다(따라서 집합의 첫 번째 줄은 항상 해당 집합을 나타내도록 선택됩니다). POSIX는 이러한 안정성을 요구하지 않지만 매뉴얼에 따르면 {Free,Net,Open}BSD 및 GNU 구현이 이를 제공합니다. 유혹적인 운명을 즐기고 있다면:

ls | sort -t- -k1,1 -k2,2rn | sort -mut- -k1,1 | pax -rw /path/to/dir

두 경우 모두 대상 디렉터리가 현재 작업 디렉터리에 있어서는 안 됩니다.

답변4

보다 안정적이고 사용자 정의 가능한 파일 이름 구문 분석을 위해 파일을 탭으로 구분된 부분으로 분할한 다음 awk를 사용하여 각 항목의 최고 순위를 찾아 보고했습니다. 다음으로 진행하기 전에 파이프라인의 각 부분을 먼저 시도해 보십시오!

find DIR -type f <other find criteron> -print | 
perl -lne 'print join("\t",(/^(.*?-)(\d+)(\.\w+)$/))' |
awk -F\\t '$2 > f[$1] { f[$1]=$2;e[$1]=$3; } END { for (k in f) { print k f[k] e[k] }}' |
xargs cp -t <desination_directory>

awk 스크립트는 각 파일 이름을 연관 배열 항목에 넣고 항상 발견된 가장 높은 순위를 유지합니다. 확장은 자체 배열에 저장됩니다. 모든 입력이 처리된 후 모든 배열 항목이 한 줄에 하나씩 출력됩니다. 이 xargs cp -t줄은 모든 파일을 지정한 디렉터리에 복사합니다.

또 다른 방법이 있습니다.작동하지 않습니다숫자가 9보다 크고 0으로 채워지지 않은 경우 매우 좋습니다. 이 방법은 파일을 사전순으로 정렬한 다음 목록을 구문 분석할 때 첫 번째 부분이 변경되고 가장 최근에 표시된 파일 이름이 사용됩니다. 파일 이름이 다음과 같으면 작동하지 않습니다.

file-9.txt
file-10.txt

file-10.txt가 file-9 앞에 나타나기 때문입니다. 위의 awk 스크립트는 수치 비교를 수행합니다.

주의 사항: 탭과 줄 바꿈이 포함된 파일 이름을 사용하면 숨이 막힐 수 있습니다.

주의 사항 2: 파일 이름 접두사당 여러 개의 확장자가 가능한 경우 이를 올바르게 설정하려면 몇 가지 조정이 필요합니다.

관련 정보