如何仅列出指定目录下的tar文件?执行ls通配符命令失败问题求助
如何仅列出指定目录下的tar文件?执行ls通配符命令失败问题求助
嗨,我来帮你捋清楚这个问题~你完全没做傻事,这其实是个很常见的shell权限与通配符展开的小坑!
问题原因
当你执行 sudo ls /var/opt/gitlab/backups/*.tar 时,通配符*.tar是由当前普通用户(usr01)的shell先处理的,而不是切换到root后再处理。但你的普通用户没有访问/var/opt/gitlab/backups/目录的权限,shell没法读取目录里的文件来展开通配符,只能把*.tar原样传给ls命令。此时root用户执行ls时,找不到名为*.tar的文件,自然就报错了。
而你直接执行 sudo ls /var/opt/gitlab/backups/ 能看到文件,是因为这个命令里没有通配符,ls由root执行后直接读取目录内容,不需要普通用户的shell提前处理,所以能正常显示。
解决办法
给你几个可行的方案:
- 让root的shell处理通配符:通过sudo启动一个root的shell来执行命令,这样通配符会由有权限的root环境展开:
sudo bash -c 'ls /var/opt/gitlab/backups/*.tar' - 先切换到root环境再执行:先进入root的交互式shell,再执行ls命令,避免通配符权限问题:
或者用sudo su - ls /var/opt/gitlab/backups/*.tarsudo -i直接进入root环境,效果是一样的。 - 用find命令替代:find命令可以直接由root执行,精准查找指定目录下的tar文件,还能避免通配符的问题:
其中sudo find /var/opt/gitlab/backups/ -maxdepth 1 -type f -name "*.tar"-maxdepth 1表示只查找当前目录,不递归子目录;-type f确保只找文件(排除tmp目录)。
备注:内容来源于stack exchange,提问作者0___________
相关产品推荐
相关产品推荐

