リモートパスがディレクトリかファイルであるかを確認するには?

リモートパスがディレクトリかファイルであるかを確認するには?

私は、リモートパスがディレクトリ(またはシンボリックリンクディレクトリ)または読み取り可能なファイルを指していることを確認するための短くて簡単な方法を探しています。

ディレクトリの場合は、scp特定のファイルをそのディレクトリ内からローカルシステムに転送できますが、ファイルの場合はscpそのファイルでのみ作業できます。

私が知っていたファイルパスscpuser@host:/path/to/dir-or-file

bash注:ローカルシステム(WindowsのMobaXterm)では使用できますが、リモートシステム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

scpoptionsなしでディレクトリを転送するように指示された場合は-r失敗します。これを使用して、リモートホストの指定されたパスがディレクトリであることを検出し、scp最初にパス名をファイルとして取得できない場合は、2番目の呼び出しでディレクトリ内の特定のファイルを取得できます。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シェルスクリプト以外のディレクトリのみをテストする必要がある場合は、次のようにテストを使用できます。

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」(リンク)です。

関連情報