특정 형식의 디렉토리에 있는 모든 최신 파일

특정 형식의 디렉토리에 있는 모든 최신 파일

특정 형식의 최신 파일을 변수에 포함시키고 싶습니다.

: /home/test에 5개 파일:

  • file_test_hadoop_20181130.csv(이것은 hadoop 파일의 마지막 수정입니다)
  • file_test_hadoop_20181130.txt
  • file_test_hadoop_20181130.ini

  • file_test_hub_20181130.txt(txt 파일의 마지막 수정 버전입니다)

  • file_test_hub_20181130.csv
  • File_test_hub_20181130.ini

따라서 내가 원하는 결과는 각 유형에서 마지막으로 수정된 결과입니다. HADOOP_NAME=file_test_hadoop_20181130.csv
HUB_NAME=file_test_hub_20181130.txt

그래서 저는 다음과 같은 일을 시작했습니다.

HADOOP_NAME=$(ls -tr /home/test | tail -n 1 | find /home/test -max 깊이 1 -name "file_test_hadoop*" -printf '%f\n')

HUB_NAME=$(ls -tr /home/test | tail -n 1 | find /home/test -max 깊이 1 -name "file_test_hub*" -printf '%f\n')

하지만 파일은 다 받았어요.

답변1

따라서 특정 이름 지정 패턴을 사용하여 최근에 수정된 파일을 검색하려고 합니다. 다음 명령이 작동합니다.

[haxiel@testvm1 ~]$ ls -1t file_test_hadoop* | head -n1
file_test_hadoop_20181130.csv

[haxiel@testvm1 ~]$ ls -1t file_test_hub* | head -n1
file_test_hub_20181130.txt

답변2

다음 명령을 사용해보십시오. 훌륭하게 작동합니다.

ls -ltrh /home/test/file_test_hadoop*| tail -n1
ls -ltrh /home/test/file_test_hub* | tail -n1

답변3

ls를 구문 분석하거나 ls를 파이프하여 찾아서 인쇄하는 대신 bash 배열, 쉘 와일드카드 및 YYYYMMDD의 자연 정렬 순서를 사용하세요.

cd /home/test
hadoop_files=(file_test_hadoop*)
HADOOP_NAME=${hadoop_files[-1]}
unset hadoop_files
hub_files=(file_test_hub*)
HUB_NAME=${hub_files[-1]}
unset hub_files
cd -

그러면 다양한 패턴과 일치하는 파일 이름 목록으로 임시 배열 변수가 채워집니다. 파일이 전혀 없거나 예상치 못한 패턴(예: file_test_hadoop9)이 있는 파일에 대한 오류 검사를 추가해야 합니다.

답변4

첫 번째 명령

ls -tr 

, 시간별로 파일을 올바르게 나열합니다.

파이프로 연결하면

tail -n1

마지막 항목, 최신 파일을 올바르게 선택합니다.

문제는 파일 패턴과 일치할 수도 있고 일치하지 않을 수도 있다는 것입니다.

물론 마지막 명령은 이전 명령으로부터 입력을 전혀 받지 않으므로 예상대로 실행되어 모든 파일을 나열합니다.

find /home/test -maxdepth 1 -name "file_test_hadoop*" -printf '%f\n'

이 문제를 해결하려면 먼저 올바른 패턴에서 시작하여 일치해야 ls합니다 .grep

ls -tr | grep "file_test_hadoop" > File_List.txt

그러면 최신 파일이 맨 아래에 표시되는 목록이 포함된 파일이 생성됩니다.

tail -n1 File_List.txt

그래서 귀하의 코드는HADOOP_NAME="$(tail -n1 File_List.txt)"

관련 정보