我正在运行可变大小和内容测试集的测试。数据文件经常添加和删除。我正在寻找一种自动收集文件列表的方法。
所有文件都位于D
;的子目录中我需要将完整目录和名称添加到文本文件中。但是,我只需要那些具有“配对”文件的文件,该文件具有相同的文件名但不同的扩展名(所以......不同的文件名,但以结构化方式)。所以,如果有MyFileName.A
和MyFileName.B
,那么我想D/.../MyFileName
添加到文件列表中。
有.A
没有.B
文件的文件,但没有.B
没有.A
文件的文件。如果 a.A
有一个.B
文件,则两个文件位于同一目录中。
有什么建议吗?
答案1
如果没有文件名包含任何换行符,您可以执行以下操作:
find D -type f \( -name '*.A' -o -name '*.B' \) |
sed 's/\.[^.]*$//' |
sort |
uniq -d >paired_files
.B
这应该适用于有文件而没有文件的更一般情况.A
。
要使用最新的 GNU 工具处理任何文件名:
find D -type f \( -name '*.A' -o -name '*.B' \) -print0 |
sed -z 's/\.[^.]*$//' |
sort -z |
uniq -dz |
tr '\0' '\n' >paired_files
答案2
如果您的陈述是正确的“没有 .A 文件就没有 .B 文件。”,则获取 .B 文件列表并删除扩展名。
find $directory-to-search -name "*.B" | sed -r -e "s~(.*)\.B~\1~g"
答案3
和zsh
:
print -rl mydir/**/*.A(.e_'REPLY=$REPLY:r; [[ -f $REPLY.B ]]'_)
:r
$REPLY
删除扩展名,因此如果was的内容mydir/somedir/somefile.A
在运行后REPLY=$REPLY:r
其内容变为mydir/somedir/somefile
;
其余的类似于这个答案。