我想解析一下n带有循环的目录中的最新文件for
。我考虑过使用ls -t
管道连接到 ahead -n<number_of_files>
但它不起作用,因为我使用带有空格的文件。
我应该如何修改以下脚本以仅解析n最新文件:
[ -n "$BASH_VERSION" ] && shopt -s nullglob
for f in *; do
[ -e $f ] && echo $f || continue
done
我正在寻找sh
兼容的解决方案。
答案1
您对被(取消)设置进行了检查$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++))
请注意,我在使用字符串变量的所有地方都用双引号引起来了。这可以保护它的值不被 shell 解析并分成空格上的单词。 (一般来说,使用变量时最好用双引号引起来。)
我重新阅读了您的问题并意识到您想要 N最近修改过的文件。如果您使用 GNU 工具,我会使用它们安全地生成文件列表,但您没有指定这些工具,所以我求助于从ls
.一般来说,这不是一个好的做法,主要是因为文件名可以包含非打印字符甚至换行符,但我不知道有更好的非 GNU 解决方案而不需要放入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