如何检查远程路径是目录还是文件?

如何检查远程路径是目录还是文件?

我正在寻找一种简短的简单方法来检查远程路径是否指向目录(或符号链接目录)或可读文件。

如果它是一个目录,那么我可以scp从该目录内部将多个特定文件传输到我的本地系统,而如果它是一个文件,我只能使用scp该文件。

我以 -方式给出的文件路径scpuser@host:/path/to/dir-or-file.

注意:在本地系统(Windows 上的 MobaXterm)上,我有bash和可用,scpssh远程系统(我想检查路径所在的位置)是一个完整的 Linux 发行版。

答案1

您正在寻找传输文件(如果它是文件)或目录的一部分(如果它是目录)。

if ! scp user@host:/path/to/dir-or-file local/path
then
    scp user@host:/path/to/dir-or-file/some-specific-file local/path
fi

如果scp被告知传输一个没有选项的目录-r,它将失败。您可以使用它来检测远程主机上的给定路径是否是目录,然后如果第一次无法将路径名作为文件获取,scp则第二次调用以获取目录内的特定文件。scp

当然,如果你想转移所有的目录(如果它是一个目录)你可以这样做

scp -r user@host:/path/to/dir-or-file local/path

无论路径是目录还是文件,它都可以工作。

答案2

您可以运行以下命令:

ssh user@host file /path/to/dir-or-file

结果将是可能的文件类型:

/path/to/dir-or-file: directory
/path/to/dir-or-file: symbolic link to `whatever'
/path/to/dir-or-file: UTF-8 Unicode text
/path/to/dir-or-file: ELF 64-bit LSB executable ... 
....

笔记:如果您只需要测试目录或不在 bash shell 脚本中,您只需使用如下测试:

ssh user@host test -d /path/to/dir-or-file
if [ $? -eq 0 ]; then 
  echo this is a dir
else 
  echo this is not a dir
fi

答案3

如果您不介意错误消息并且只需要复制非点文件,那么一种快速而肮脏的方法是:

scp -p asuser@host:'/path/to/dir-or-file/*' asuser@host:'/path/to/dir-or-file' .

尾随点将远程文件复制到当前目录。调整口味。该-p标志保留时间戳和权限。如果不需要这些,请省略。

答案4

此信息也可在 ls 的输出中找到:第一列中的第一个符号是:“d”表示目录“l”表示链接

相关内容