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