列出目录层次结构中的文件

列出目录层次结构中的文件

我需要在目录层次结构中列出文件。为此我写了这样的脚本

foreach file ( * )
    ls ${file}/*/*/*/*/*.root > ${file}.txt
end

但为此我必须知道在目录 ${file} 中有 4 个目录。那么,有什么方法可以概括这个脚本,这样我就不必知道存在多少个子目录?

答案1

csh现在几乎所有的发现实际上都是tcsh如果您使用 tsh 6.18.00 (20120114) 或更新版本,您可以使用**(检查tcsh --version):

ls "${file}"/**/*.root

这会仅有的globstar如果设置了变量,则有效:

set globstar

完整文档来自tcsh(1)

shellglobstar变量可以设置为允许*****作为匹配任何字符串(包括 )的文件全局模​​式 /,递归遍历任何现有子目录。例如,ls **.c将列出当前目录树中的所有 .c 文件。如果单独使用,它将匹配零个或多个子目录(例如,ls /usr/include/**/time.h将列出 time.h /usr/include 目录树中命名的任何文件;ls /usr/include/**time.h将匹配 /usr/include 目录树中以 结尾的任何文件 time.h;并且 ls /usr/include/**time**.h将匹配任何 . h 文件,time其位于子目录名称中或文件名本身中)。为了防止递归问题,**glob 模式不会下降到包含目录的符号链接。要覆盖此设置,请使用***(+)

答案2

使用find命令。

foreach file ( * )
    find ${file} -name "*.root" > ${file}.txt
end

考虑使用 csh 以外的 shell,csh 已经过时了大约 20 年。交互式使用 zsh 或 bash,并且不要对脚本使用 csh

相关内容