到目前为止,我有以下命令,稍微停留在下一位。
comm -23 <( find /dir1/report_dir2/dir3/2013* -name *\*MyFile* -exec basename {} \; | sort | uniq ) <( find /dir0/dir1/dir2/loadedreports/archive* -name *\*MyFile* -exec basename {} \; | sort | uniq ) > /home/Ben10/list.txt
目录1
/dir1/report_dir2/dir3/2013*
中的文件是csv文件,其名称中可能有或不带.gz
个扩展名,解压缩它们是不可能的,因为它们每个都有一个演出,并且我有成千上万的人。
即它们看起来像MyFile20130618073529.csv
或MyFile20130618073529.csv.gz
目录2
/dir0/dir1/dir2/loadedreports/archive*
中的文件已加载到BI系统,并且都将以.csv结尾,
然而,它们之前也会有加载日期,
即。 2013-11-06_MyFile20130618073529.csv
我正在从这些csv文件中将它们加载到BI DB中,并检查我加载了哪些文件我需要检查哪些文件位于/dir1/report_dir2/dir3/2013*
但不在dir0/dir1/dir2/loadedreports/archive*
有没有办法忽视.gz
和2013-11-06_
?请注意,2013-11-06_可以是MyFile之前的任何日期。
万分感谢,任何输入都非常感谢。
答案 0 :(得分:2)
尝试以下
comm -23 <( find /dir1/report_dir2/dir3/2013* -name '*MyFile*' | perl -pe 's/.*(MyFile[^.]*\.csv)(\.gz)?$/$1/' | sort -u ) <( find /dir0/dir1/dir2/loadedreports/archive* -name '*MyFile*' | perl -pe 's/.*(MyFile[^.]*\.csv)$/$1/' | sort -u ) > /home/Ben10/list.txt
这里的想法是使用perl
搜索并替换basename
替换已找到的完整文件名,以获得所需的基本名称,丢弃.gz
后缀和<date>_
前缀< / p>
为了使上面的一个班轮更具可读性,我宁愿将它拆分如下
find /dir1/report_dir2/dir3/2013* -name '*MyFile*' | perl -pe 's/.*(MyFile[^.]*\.csv)(\.gz)?$/$1/' | sort -u > /home/Ben10/di1_list.txt
find /dir0/dir1/dir2/loadedreports/archive* -name '*MyFile*' | perl -pe 's/.*(MyFile[^.]*\.csv)$/$1/' | sort -u > /home/Ben10/di2_list.txt
comm -23 /home/Ben10/di1_list.txt /home/Ben10/di2_list.txt > /home/Ben10/list.txt
rm /home/Ben10/di1_list.txt /home/Ben10/di2_list.txt