我需要在目录层次结构中列出文件。为此我写了这样的脚本
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)
:
shell
globstar
变量可以设置为允许**
或***
作为匹配任何字符串(包括 )的文件全局模式/
,递归遍历任何现有子目录。例如,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。