Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用于迭代文件和目录的Shell脚本_Bash_Shell - Fatal编程技术网

Bash 用于迭代文件和目录的Shell脚本

Bash 用于迭代文件和目录的Shell脚本,bash,shell,Bash,Shell,我有一个目录,其中包含以日期标记的子目录。每个子目录都包含按小时标记的文件 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 ... -20

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

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
...
我想搜索一个特定的字符串,从最新的文件开始到最短的文件

我尝试了以下代码片段来遍历目录:

MAIN_DIR="/<main_dir_location>"
for directory in `$MAIN_DIR/* | sort -r`; do
    echo "$directory"
done
MAIN_DIR=“/”
对于“$MAIN_DIR/*| sort-r”中的目录;做
echo“$directory”
完成

MAIN_DIR=“/”
对于$中的目录(“$MAIN_DIR”/*| sort-r);做
echo“$directory”
完成
我犯了一个错误

/<main_dir_location>/2017-07-12: is a directory
//2017-07-12:是一个目录
在我看来,shell似乎正在尝试执行从for-each循环获得的目录值

  • 这种理解正确吗
  • 我该如何补救
  • 有没有更好的方法来完成我在这里要做的事情
    • 你必须这样做

      for directory in $( ls -d "$MAIN_DIR" | sort -r); do
      
      您的命令试图将目录名用作命令

      ls-d
      列出了
      $MAIN\u DIR
      下的所有目录,并将它们传递给
      sort-r

      但是

      您可以使用“按修改日期查找和排序答案”(或类似选项):

      -仅键入d
      目录

      -maxdepth 1
      进入一个文件夹深度

      如果你想,你甚至可以通过正则表达式和更复杂的操作过滤,比如“比文件更新”

      要查找选项和查找printf选项,只需咨询

      for directory in $( ls -d "$MAIN_DIR" | sort -r); do
      
      您的命令试图将目录名用作命令

      ls-d
      列出了
      $MAIN\u DIR
      下的所有目录,并将它们传递给
      sort-r

      但是

      您可以使用“按修改日期查找和排序答案”(或类似选项):

      -仅键入d
      目录

      -maxdepth 1
      进入一个文件夹深度

      如果你想,你甚至可以通过正则表达式和更复杂的操作过滤,比如“比文件更新”

      有关查找选项和查找printf选项,请参阅“$MAIN\u DIR”/* 展开(除非目录为空)到目录列表。您将此扩展放置在需要命令的位置,这将导致第一个扩展项作为可执行文件进行尝试

      如果在扩展名前面加上

      printf '%s\n' #prints each argument on a line
      
      脚本将正常工作(只要文件名中没有空格/全局字符):

      “$MAIN\u DIR”/*
      展开(除非目录为空)到目录列表。您将此扩展放置在需要命令的位置,这将导致第一个扩展项作为可执行文件进行尝试

      如果在扩展名前面加上

      printf '%s\n' #prints each argument on a line
      
      脚本将正常工作(只要文件名中没有空格/全局字符):


      在当前目录中以反向排序的顺序迭代文件的最干净的方法是什么?尝试使用类型f进行查找,并将正确的排序参数传递给它。如果您找到了使用find对文件进行排序的方法,您甚至可以使用
      -exec
      参数对这些文件执行操作。有关迭代文件夹的示例,请参见“我的编辑”。在当前目录中,以反向排序顺序迭代文件的最干净方法是什么?请尝试使用类型f进行查找,并将正确的排序参数传递给它。如果您找到了使用find对文件进行排序的方法,您甚至可以使用
      -exec
      参数对这些文件执行操作。有关迭代文件夹的示例,请参见我的编辑。我相信您缺少
      ls
      命令,请尝试以下操作:
      $(ls“$MAIN\u DIR”/*\sort-r)
      。您看到该命令了吗?这几乎可以肯定是您想要的。也许一个好的解决方案是
      grep
      递归并按文件名排序。我相信您缺少
      ls
      命令,请尝试以下命令:
      $(ls“$MAIN\u DIR”/*\sort-r)
      。您看到该命令了吗?这几乎可以肯定是您想要的。也许一个好的解决方案是
      grep
      recursive并按文件名排序。
      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