분석하고 싶다N루프가 있는 디렉토리의 최신 파일입니다 for
. ls -t
파이프를 사용하여 연결하려고 생각했지만 head -n<number_of_files>
공백이 있는 파일을 사용하고 있기 때문에 작동하지 않습니다.
구문 분석만 수행하려면 다음 스크립트를 어떻게 수정해야 합니까?N최신 문서:
[ -n "$BASH_VERSION" ] && shopt -s nullglob
for f in *; do
[ -e $f ] && echo $f || continue
done
sh
호환 가능한 솔루션을 찾고 있습니다 .
답변1
(un)set 에 대한 검사가 있는데 $BASH_VERSION
, 이는 아마도 당신이 sh
에 속하기보다는 에 속한다고 생각하고 있음을 의미합니다 bash
. 이를 위해 nullglob
코드는 어쨌든 이 경우를 확인해야 하므로 이를 생략할 수 있습니다.
n=10 # Process no more than this number of files
k=0
for f in *
do
[ -f "$f" ] || continue
k=$((k+1))
# Do stuff with your files as "$f"
:
[ $k -ge $n ] && break
done
echo "Files processed: $k"
그냥 사용하고 싶다면 약간의 변경을 할 수 있습니다.bash
[[ ... ]]
대신 사용[ ... ]
k=$((k+1))
사용. . . 교체((k++))
문자열 변수를 사용하는 모든 곳에서는 큰따옴표를 사용하고 있습니다. 이는 해당 값이 쉘에 의해 구문 분석되고 공백에서 단어로 분할되는 것을 방지합니다. (일반적으로 변수를 사용할 때는 큰따옴표를 사용하는 것이 가장 좋습니다.)
귀하의 질문을 다시 읽고 귀하가 N을 원한다는 것을 깨달았습니다.최근 수정됨문서. GNU 도구를 사용하는 경우 이를 사용하여 파일 목록을 안전하게 생성할 수 있지만 이를 지정하지 않았기 때문에 ls
. 인쇄되지 않는 문자나 개행 문자도 있지만 zsh
.
n=10 # Process no more than this number of files
k=0
ls -t |
while IFS= read -r f
do
[ -f "$f" ] || continue
k=$((k+1))
# Do stuff with your files as "$f"
:
[ $k -ge $n ] && break
done
GNU 도구의 경우 다소 복잡한 파이프라인을 사용합니다.
find -maxdepth 1 -type f -printf "%T@\t%p\0" | # Prefix numeric timestamp
sort -z -k1,2rn | # Sort by the timestamp
cut -z -f2- | # Discard the timestamp
head -z -n$n | # Keep only the top N files
while IFS= read -r -d '' f
do
# Do stuff with your files as "$f"
:
done