我有一个愚蠢的问题
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
我可能做了一些傻事。
通配符扩展由 shell 完成,而不是由“ls”完成。换句话说,他们不会等待“sudo”生效。
当您的 shell 没有权限查看受保护目录中的文件时,它无法扩展通配符,因此结果是要求“ls”显示一个字面上名为
*.tar
. (如前所述,“ls”本身不进行通配符扩展。)作为一般解决方案,让“sudo”先运行 shell 的另一个副本——这将使用 root 权限处理通配符扩展:
(
sudo $SHELL -c '...'
可能更笼统,但“sh”可以胜任。)某些程序可能有自己的选项,例如
--include=...
在程序本身中扩展通配符。不幸的是,“ls”只有--ignore='*.tar'
但没有选择只包含特定名称的选项。另一个答案很好地告诉了您为什么您的特定解决方案不起作用,所以我不会对此喋喋不休。
你应该使用像
find
请注意,
-type f
因为它很重要,所以它确保只匹配文件。命名文件夹并没有什么违法的mydir.tar
,你的ls
想法会匹配这样的目录。