일반화하다
ls
터미널의 다음 명령이 10초를 기다리지 않고 디렉터리의 파일을 즉시 나열하도록 bash 스크립트에서 어떤 명령을 실행할 수 있습니까 ?
"추가 정보" 끝에 있는 질문 1과 질문 2를 참조하세요.
세부
내 디렉토리에는 100MB에서 1GB 크기의 비디오 파일(mp4) 700개가 있습니다. 평균 파일 크기는 200MB입니다.
부팅 후 처음으로 파일을 나열할 때(터미널에서 ls를 사용하거나 pcmanfm을 사용하여) 파일을 나열하는 데 10초가 걸립니다. 나중에 파일을 다시 나열하면(ls 또는 pcmanfm 사용) 파일이 거의 즉시 나열됩니다.
따라서 이 초기 대기 시간을 우회하기 위해 시작 후 스크립트에서 다음 명령을 실행했습니다.
ls /path/to/vid-directory
...ls 또는 pcmanfm을 사용하여 디렉토리를 나열하면 파일이 즉시 나열됩니다.
그런데 이상하게도 달리는 중
ls /path/to/vid-directory
SCRIPT의 NEXT는 ls 또는 pcmanfm이 파일을 즉시 나열하도록 하지 않습니다(10초 후에 나열함). 또한 이상한 점은 초기 스크립트가 실행될 때 파일이 거의 즉시 나열된다는 것입니다.
따라서 터미널에서 ls를 실행하면 RAM 캐시에 파일 이름이 저장되는 것처럼 보이지만 스크립트에서 ls를 실행하면 그렇지 않습니다*.
질문 1:왜 후자*가 발생합니까?
질문 2:다음 ls 또는 pcmanfm이 파일을 즉시 나열하도록 하려면 스크립트에서 어떤 명령을 실행해야 합니까?
추신: 테스트할 때 다음을 실행하여 RAM이 처음에 비어 있는지 확인했습니다.
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
답변1
ls
터미널과 스크립트 ls
사이의 유일한 차이점은 별칭을 사용하여 ls
파일 이름 목록뿐만 아니라 파일 속성도 읽어야 하는 옵션을 전달한다는 것입니다. 옵션은 아마도 입니다 --color
. 파일 이름 목록을 읽으려면 디렉토리 자체에서만 읽어야 하지만, 파일 속성을 읽으려면 ( lstat
시스템 호출을 통해) 각 파일의 inode에 액세스해야 합니다. 따라서 스크립트를 실행하면 ls
해당 속성이 아닌 파일 이름만 캐시에 남게 됩니다. 속성은 터미널에서 처음 ls
실행하거나 GUI 파일 관리자를 사용할 때 로드되어야 합니다.
ls
터미널에서 사용하는 스크립트에 동일한 옵션을 전달합니다.
10초 안에 700개의 파일만 나열하는 것은 엄청나게 느립니다. 파일 크기는 중요하지 않습니다. 일반적인 최신 시스템은 수만 또는 수십만 개의 파일을 처리할 때만 눈에 띄게 느려지기 시작합니다.
답변2
다음을 실행하여 문제를 정확히 찾아낼 수 있습니다.
strace -tt -o ls.strace ls /path/to/directory
출력 ls
속도를 높일 수 있지만 ls -U
, 물론 이로 인해 출력이 변경됩니다.
700개의 파일은 큰 숫자가 아닙니다. 모든 디렉토리 항목을 다시 작성하면 속도가 어느 정도 향상될 수 있습니다.
mkdir /tmpdir/on/the/same/filesystem
mv * /tmpdir/on/the/same/filesystem
mv /tmpdir/on/the/same/filesystem/* .
그러나 아마도 가장 효율적인 해결책은 시작 시 백그라운드에서 이 디렉터리를 자동으로 읽는 것입니다.