디렉터리의 모든 파일(각 파일에는 하나의 열이 있음)을 여러 열이 있는 단일 파일로 병합하고 싶습니다. 그러나 마지막 수정 시간 순서대로 파일을 붙여넣어야 합니다. 즉, 새 파일에서 첫 번째 열은 가장 오래된 파일의 열이고 마지막 열은 최신 파일의 열이 됩니다.
이 연대기를 반영하기 위해 원본 파일의 이름을 변경할 수 없습니다. 나는 명령을 사용했다이 질문에 묻고 답함그러나 "*"는 파일 시간 정렬에 적합하지 않기 때문에 내 요구 사항을 충족시키지 못합니다.
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
것처럼 ).failglob
bash
파일을 다른 디렉터리에 쓰거나 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
명령줄에 지정된 순서대로 파일을 구문 분석하면 됩니다.