【问题标题】:Shell script for iterating over files and directories用于迭代文件和目录的 Shell 脚本
【发布时间】:2017-07-18 21:58:34
【问题描述】:

我有一个目录,其中包含按日期标记的子目录。这些子目录中的每一个都包含按小时标记的文件

parent_dir\
--2017-07-12\
  -2017-07-12-00 
  -2017-07-12-01
  -2017-07-12-02
  -2017-07-12-03
  ...
  -2017-07-12-23
--2017-07-13\
  -2017-07-13-00 
  -2017-07-13-01
  -2017-07-13-02
  -2017-07-13-03
  ...
  -2017-07-13-23
--2017-07-14
...

我想从最近的文件开始搜索特定的字符串。

我尝试了以下 sn-ps 来遍历目录:

MAIN_DIR="/<main_dir_location>"
for directory in `$MAIN_DIR/* | sort -r`; do
    echo "$directory"
done

MAIN_DIR="/<main_dir_location>" 
for directory in $("$MAIN_DIR"/* | sort -r); do
    echo "$directory"
done

我收到一个错误

/<main_dir_location>/2017-07-12: is a directory

在我看来,shell 似乎正在尝试执行从 for each 循环中获得的目录值。

  • 这种理解正确吗?
  • 我该如何解决这个问题?
  • 有没有更好的方法来完成我在这里尝试做的事情?

【问题讨论】:

  • 我相信你缺少ls 命令,试试这个:$(ls "$MAIN_DIR"/* | sort -r)
  • 您见过find 命令吗?这几乎肯定是你想要的。
  • 也许一个好的解决方案是grep递归并按文件名排序。

标签: bash shell


【解决方案1】:

"$MAIN_DIR"/* 展开(除非目录为空)为目录列表。您将此扩展放置在预期命令的位置,这会导致第一个扩展项被尝试为可执行文件。

如果你在扩展前加上

printf '%s\n' #prints each argument on a line

脚本可以运行(只要文件名中没有空格/通配符):

MAIN_DIR="/<main_dir_location>" 
for directory in $(prinf '%s\n' "$MAIN_DIR"/* | sort -r); do
    echo "$directory"
done

如果您想消除通配字符和大多数空格的问题(换行符仍然是不可以),您可以这样做:

printf  '%s\n' "$MAIN_DIR"/* | sort -r | while read -r directory; do
     #...
done 

【讨论】:

    【解决方案2】:

    你必须这样做

    for directory in $( ls -d "$MAIN_DIR" | sort -r); do
    

    您的命令尝试使用目录名称作为命令。

    ls -d 列出$MAIN_DIR 下的所有目录并将它们传递给sort -r

    但是

    您可以使用查找并按修改日期(或类似日期)对答案进行排序:

    find $MAIN_DIR -type d -maxdepth 1 -printf "%T+\t%p\n" | sort
    

    -type d 仅限目录

    -maxdepth 1 深入一个文件夹

    如果您愿意,您甚至可以按正则表达式和更复杂的操作(例如“比文件新”)进行过滤..

    有关查找选项和查找 printf 选项,请咨询find's manpage

    【讨论】:

    • 在当前目录中以反向排序顺序迭代文件的最干净的方法是什么?
    • 尝试使用 f 类型查找并传递正确的排序参数。如果您找到一种使用 find 对文件进行排序的方法,您甚至可以使用 -exec 参数对这些文件执行操作。有关迭代文件夹的示例,请参阅我的编辑。
    猜你喜欢
    • 2014-04-23
    • 2011-04-13
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多