for 루프 내부의 tail 명령

for 루프 내부의 tail 명령

나 그거 연구해봤어

ls -dtr1 * | tail -5 | awk 'NR==2'

최근 생성된 5개 폴더 중 마지막에서 두 번째 폴더를 나열합니다.

for 루프에서 사용하고 싶어서 쉘 스크립트를 만들었습니다.forLoopExample.sh

for ii in $(seq 1 $1)
do
  f_name=`ls -dtr1 * | tail -$1 | awk 'NR==$ii'`
  
     # mkdir $f_name in some other location
     # and some other operations 

done

sh forLoopExample.sh 3 루프를 실행하면 세 번 실행되어 세 폴더 모두에서 예상되는 작업이 수행될 것으로 예상했습니다 . 하지만 mkdir오류가 발생합니다. 여기에 이미지 설명을 입력하세요.

이 오류를 해결하도록 도와주세요. 미리 감사드립니다.

답변1

코드에 최소한 세 가지 문제가 있습니다.

  1. awk프로그램에서 쉘 변수를 사용 하려고 합니다 . 올바른 방법은 awk쉘 변수의 값을 사용하여 변수를 생성하는 것입니다.

     awk -v line="$ii" 'NR == line'
    
  2. /* ... */쉘 스크립트에서 C와 유사한 주석을 사용할 수 있습니다. 쉘 스크립트의 주석은 #다음 개행 문자로 시작되고 확장됩니다.

  3. ls타임스탬프 순서로 이름을 얻으 려면 구문 분석을 사용합니다 . 이름에 개행 문자가 포함되어 있으면 중단됩니다. 대신 다음과 같은 것을 사용하십시오.

     f_name=$( zsh -c 'print -rC1 *(/om[$1])' zsh "$ii" )
    

이는 zsh쉘을 사용하여 ii현재 디렉토리에서 :th 가장 최근에 수정된 디렉토리의 이름을 가져옵니다. mtime디렉터리의 타임스탬프는 기존 파일이 업데이트되거나 콘텐츠가 하위 디렉터리에 추가되거나 제거될 때가 아니라 디렉터리 항목이 디렉터리에서 추가되거나 제거될 때 업데이트됩니다 .

에서는 zsh타임스탬프 순서에 따라 현재 디렉터리의 디렉터리를 반복합니다 mtime.

for dir in *(/om); do
    # use "$dir" here
done

가장 최근에 수정된 첫 번째 디렉토리만 반복 *(/om[1,$1])하는 패턴 으로 사용됩니다.$1

또한보십시오:

관련 정보