我有一些具有以下结构的目录:
DAY1/ # Files under this directory should have DAY1 in the name.
|-- Date
| |-- dir1 # Something wrong here, there are files with DAY2 and files with DAY1.
| |-- dir2
| |-- dir3
| |-- dir4
DAY2/ # Files under this directory should all have DAY2 in the name.
|-- Date
| |-- dir1
| |-- dir2 # Something wrong here, there are files with DAY2, and files with DAY1.
| |-- dir3
| |-- dir4
在每个dir
中,有数十万个名称包含DAY
的文件,例如0.0000.DAY1.01927492
。名称上包含DAY1
的文件应仅显示在父目录DAY1
下。
复制文件时出现问题,现在我在某些DAY1
目录中有DAY2
和dir
的混合文件。
我编写了一个脚本来查找包含混合文件的文件夹,因此我可以更仔细地查看它们。我的脚本如下:
for directory in */; do
if ls $directory | grep -q DAY2 ; then
if ls $directory | grep -q DAY1; then
echo "mixed files in $directory";
fi ;
fi;
done
这里的问题是我要经历两次所有文件,考虑到我只需要查看一次文件就没有意义了。
什么是更有效的方式实现我想要的?
答案 0 :(得分:2)
如果我理解正确,那么你需要递归地找到DAY1
目录下名称中有DAY2
的文件,类似于DAY2
目录的文件{{1}在他们的名字中。
如果是,请DAY1
目录:
DAY1
这将获取find DAY1/ -type f -name '*DAY2*'
目录下名称中包含DAY1
的文件。同样适用于DAY2
目录:
DAY2
两者都是递归操作。
仅获取目录名称:
find DAY2/ -type f -name '*DAY1*'
请注意,find DAY1/ -type f -name '*DAY2*' -exec dirname {} +
将显示为$PWD
。
要获得唯一性,请将输出传递给.
:
sort -u
答案 1 :(得分:1)
鉴于通过它们一次并经历两次之间的差异只是两个因素的差异,改为只通过它们的方法可能实际上不是一个胜利,因为新方法可能很容易占用每个文件两倍的长度。
所以你肯定想要试验;它不一定是你可以自信地推理的东西。
但是,我会说,除了两次浏览文件之外,ls
版本还排序文件,这可能具有超过线性的成本(除非它& #39;做某种桶式排序)。通过编写ls --sort=none
而不仅仅是ls
来消除这一点,实际上会提高算法的复杂性,并且几乎肯定能够带来切实的改进。
但是FWIW,这是一个只能浏览一次文件的版本,你可以试试:
for directory in */; do
find "$directory" -maxdepth 1 \( -name '*DAY1*' -or -name '*DAY2*' \) -print0 \
| { saw_day1=
saw_day2=
while IFS= read -d '' subdirectory ; do
if [[ "$subdirectory" == *DAY1* ]] ; then
saw_day1=1
fi
if [[ "$subdirectory" == *DAY2* ]] ; then
saw_day2=1
fi
if [[ "$saw_day1" ]] && [[ "$saw_day2" ]] ; then
echo "mixed files in $directory"
break
fi
done
}
done