我的目录中包含10000个.root
文件(每个文件看起来像hists11524_blinded.root
或hists9899_blinded.root
),并且需要运行一些宏以进行数据分析。但是,我不需要所有文件(总共只有4000个)在目录中。我在thebest.txt file
中列出了所需的跑步次数(这些4000个数字)。该文件也位于带有直方图的目录中。
我想通过使用.txt文件中的信息来删除在运行宏之前不需要进行处理的文件。
thebest.txt
文件的外观如下:
09769
09772
09773
09776
09777
09781
09782
09785
09786
09789
09790
09793
...
我的猜测是使用以下命令:
-comm -2 -3 <(ls) <(sort thebest) | tail +2 | xargs -p rm
我遇到2个错误:
tail: invalid option -- 'p'
sort: cannot read: No such file or directory
文件thebest.txt
仅包含5位数字,例如09999
或11256
,目录中包含名称为hists9999_blinded.root
或hists11256_blinded.root
的文件。
两个列表中的位数不同-这是主要问题。
答案 0 :(得分:0)
一种选择是从数字中删除前导0以匹配文件名。为避免匹配子字符串,您可以在前面和后面添加相应的文件名部分。 (在您的情况下,文件名中间应有数字。)
由于尚不清楚示例文件thebest.txt
中的前导空格是故意的还是仅是格式问题,因此也会删除前导空格。
由于删除错误的文件可能会导致数据丢失,因此您也可以考虑仅处理匹配的文件,而不是删除不匹配的文件。
# remove leading spaces followed by leading zeros and prepend/append file name parts
sed 's/ *0*\([1-9][0-9]*\)/hists\1_blinded.root/' thebest.txt > thebestfiles.txt
# get matching files and process
find . -name 'hists*_blinded.root' | fgrep -f thebestfiles.txt | xargs process_matching
# or get non-matching files and remove
find . -name 'hists*_blinded.root' | fgrep -v -f thebestfiles.txt | xargs rm
find
命令在当前目录中递归搜索。如果要排除子目录,可以使用-maxdepth 1
。为了避免处理目录名称,您还可以添加-type f
。