我有一个愚蠢的问题
usr01@srvlnx01:~$ sudo ls /var/opt/gitlab/backups/
1685014011_2023_05_25_13.2.3_gitlab_backup.tar 1685016443_2023_05_25_13.2.3_gitlab_backup.tar tmp
但
usr01@srvlnx01:~$ sudo ls /var/opt/gitlab/backups/*.tar
ls: cannot access '/var/opt/gitlab/backups/*.tar': No such file or directory
我可能做了一些傻事。
答案1
通配符扩展由 shell 完成,而不是由 'ls' 完成。换句话说,它们不会等待 'sudo' 生效。
当你的 shell 没有权限查看受保护目录中的文件时,它无法扩展通配符,因此结果是要求 'ls' 显示文件字面上地命名*.tar
。(如上所述,“ls”本身不进行通配符扩展。)
作为通用解决方案,首先让“sudo”运行 shell 的另一个副本 - 这将使用 root 权限处理通配符扩展:
sudo sh -c 'ls /var/bleh/*.tar'
(sudo $SHELL -c '...'
可能更通用,但是“sh”可以完成工作。)
某些程序可能有自己的选项,--include=...
例如做在程序本身中扩展通配符。不幸的是,“ls”只有--ignore='*.tar'
但没有仅包含特定名称的选项。
答案2
另一个答案很好地告诉了你为什么你的特定解决方案不起作用,所以我就不重复这一点了。
你应该使用像find
sudo find /var/opt/gitlab/backups -type f -name '*.tar'
注意,-type f
因为它很重要,所以它确保只匹配文件。命名文件夹mydir.tar
并没有什么不合法的,你的ls
想法会匹配这样的目录。