![识别文件名来自哪个目录](https://linux22.com/image/881149/%E8%AF%86%E5%88%AB%E6%96%87%E4%BB%B6%E5%90%8D%E6%9D%A5%E8%87%AA%E5%93%AA%E4%B8%AA%E7%9B%AE%E5%BD%95.png)
我有一个 .txt 文件名列表,这些文件名来自两个不同的目录。它们来自一个服务器数据库,并且共享一个特征(数据库标志),但我真的需要知道它们来自这两个目录中的哪一个。
有没有办法批量处理该列表以生成一个新列表来显示文件来自哪个目录?
我可以使用“查找”逐个进行查找,但列表中大约有 150 个文件。
阅读数据库查询并自己重新做列表是否更快?
答案1
如果你知道文件只能位于两个位置之一,那么明确测试每个文件可能更有效,例如
while IFS= read -r f; do
if [ -e "dir1/$f" ]; then
echo "dir1/$f"
elif [ -e "dir2/$f" ]; then
echo "dir2/$f"
else
echo "$f: not found"
fi
done < filelist
答案2
您始终可以使用命令来读取所有文件的数据库。但是,locate
运行之前必须更新数据库。locate
以下是可以采取的措施示例
$ locate --regex ".*/lightdm.conf$"
/etc/init/lightdm.conf
/etc/lightdm/lightdm.conf
现在,要批量处理文件列表,可以使用while read do. . . done < input_file
结构,locate
其中包含代码。如下所示:
$> cat > file_list.txt
passwd
lightdm.conf
firefox.desktop
$> while read line ; do
> locate --regex ".*/$line$"
> done < file_list.txt
/etc/passwd
/etc/cron.daily/passwd
/etc/pam.d/passwd
/home/xieerqi/Desktop/cleanup/passwd
/home/xieerqi/Documents/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
/usr/share/doc/passwd
/usr/share/lintian/overrides/passwd
/etc/init/lightdm.conf
/etc/lightdm/lightdm.conf
/usr/share/applications/firefox.desktop
当然,这不是最快的搜索 - 毕竟数据库包含数千个文件,但比使用遍历整个目录结构要快得多find