我研究过那个
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
您的代码至少存在三个问题:
您尝试在
awk
程序中使用 shell 变量。正确的方法是使用awk
shell 变量的值创建一个变量:awk -v line="$ii" 'NR == line'
/* ... */
您可以在 shell 脚本中使用类似 C 的注释。 shell 脚本中的注释是通过#
并延伸到下一个换行符来引入的。您依靠解析来
ls
按时间戳顺序获取名称。如果名称包含换行符,这就会中断。相反,使用类似的东西f_name=$( zsh -c 'print -rC1 *(/om[$1])' zsh "$ii" )
这使用zsh
shell 获取ii
当前目录中第 :th 最近修改的目录名称。请注意,mtime
目录上的时间戳会在目录中添加或删除目录条目时更新,而不是在更新现有文件或在子目录中添加或删除内容时更新。
在 中zsh
,按时间戳顺序循环当前目录中的目录mtime
:
for dir in *(/om); do
# use "$dir" here
done
用作仅循环第一个最近修改的目录*(/om[1,$1])
的模式。$1
也可以看看: