나 그거 연구해봤어
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
코드에 최소한 세 가지 문제가 있습니다.
awk
프로그램에서 쉘 변수를 사용 하려고 합니다 . 올바른 방법은awk
쉘 변수의 값을 사용하여 변수를 생성하는 것입니다.awk -v line="$ii" 'NR == line'
/* ... */
쉘 스크립트에서 C와 유사한 주석을 사용할 수 있습니다. 쉘 스크립트의 주석은#
다음 개행 문자로 시작되고 확장됩니다.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
또한보십시오: