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

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

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

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

sort의 -u 옵션이 안정적인 경우 awk 구성 요소는 sort -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: 각 파일 이름 접두사가 여러 확장자를 가질 수 있는 경우 올바른 확장자를 얻으려면 몇 가지 조정을 해야 합니다.

관련 정보