for 循环内的 tail 命令

for 循环内的 tail 命令

我研究过那个

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

列出最后创建的 5 个文件夹中倒数第二个创建的文件夹。

我想在 for 循环中使用它:所以我创建了一个 shell 脚本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程序中使用 shell 变量。正确的方法是使用awkshell 变量的值创建一个变量:

     awk -v line="$ii" 'NR == line'
    
  2. /* ... */您可以在 shell 脚本中使用类似 C 的注释。 shell 脚本中的注释是通过#并延伸到下一个换行符来引入的。

  3. 您依靠解析来ls按时间戳顺序获取名称。如果名称包含换行符,这就会中断。相反,使用类似的东西

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

这使用zshshell 获取ii当前目录中第 :th 最近修改的目录名称。请注意,mtime目录上的时间戳会在目录中添加或删除目录条目时更新,而不是在更新现有文件或在子目录中添加或删除内容时更新。

在 中zsh,按时间戳顺序循环当前目录中的目录mtime

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

用作仅循环第一个最近修改的目录*(/om[1,$1])的模式。$1

也可以看看:

相关内容