마지막 수정 순서대로 디렉토리의 모든 파일을 열별로 붙여넣습니다.

마지막 수정 순서대로 디렉토리의 모든 파일을 열별로 붙여넣습니다.

디렉터리의 모든 파일(각 파일에는 하나의 열이 있음)을 여러 열이 있는 단일 파일로 병합하고 싶습니다. 그러나 마지막 수정 시간 순서대로 파일을 붙여넣어야 합니다. 즉, 새 파일에서 첫 번째 열은 가장 오래된 파일의 열이고 마지막 열은 최신 파일의 열이 됩니다.

이 연대기를 반영하기 위해 원본 파일의 이름을 변경할 수 없습니다. 나는 명령을 사용했다이 질문에 묻고 답함그러나 "*"는 파일 시간 정렬에 적합하지 않기 때문에 내 요구 사항을 충족시키지 못합니다.

paste * | column -s $'\t' -t > output.txt

답변1

마지막 수정 시간을 기준으로 파일 이름을 정렬하려면:

stat -c '%Y %n' * | sort -n | cut -d " " -f 2-

개행 문자가 포함된 파일 이름은 처리하지 않습니다.

그래서:

# read the sorted filenames into an array
mapfile -t files < <(stat -c '%Y %n' * | sort -n | cut -d " " -f 2-)

# then paste the files together
paste "${files[@]}" | ...

답변2

zsh셸 에서 gobbing 한정자는 om파일 이름 gobbing 패턴이 확장되는 항목을 타임스탬프 순서로 정렬합니다 mtime(가장 최근에 수정된 파일부터 먼저, O대신 in을 사용하여 o역순으로 정렬). 와일드카드 한정자 .(점)는 와일드카드 패턴 일치를 일반 파일로만 제한합니다.

따라서 와일드카드 패턴은 *(.om)현재 디렉터리에서 타임스탬프별로 정렬되어 표시되는 일반 파일 이름으로 확장됩니다 mtime.

bash셸 에서 :

zsh -c 'paste ./*(.om)' | column -s $'\t' -t >output.txt

기본적으로 패턴이 아무것도 일치하지 않으면 쉘은 이를 오류로 처리합니다 ( 쉘 옵션이 쉘에 설정된 zsh것처럼 ).failglobbash

파일을 다른 디렉터리에 쓰거나 output.txt더 구체적으로 출력 파일 이름을 가져오지 않도록 글로빙 패턴을 사용할 수 있습니다. 다음은 output.txt수정된 와일드카드 패턴 이름의 사용을 명시적으로 방지합니다 .

zsh -o extended_glob -c 'paste ./(^output.txt)(.om)' | columns -s $'\t' -t >output.txt

답변3

첫 번째 파일에 전달된 파일 목록을 정렬할 수 있습니다 paste.

paste $(ls -t) | column -s $'\t' -t

ls -t"수정 시간순, 최신순"으로 정렬된 파일을 반환합니다.

paste명령줄에 지정된 순서대로 파일을 구문 분석하면 됩니다.

관련 정보