web-dev-qa-db-ja.com

リモートパスがディレクトリかファイルかを確認するにはどうすればよいですか?

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

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

scp- manner asuser@Host:/path/to/dir-or-fileで指定されたファイルパスがあります。

注:ローカルシステム(WindowsのMobaXterm)では、bashscpおよびsshが利用可能ですが、リモートシステム(パスが存在する場所にチェックしたい) )は完全なLinuxディストリビューションです。

2
halloleo

ファイル(ファイルの場合)、またはディレクトリの一部(ディレクトリの場合)を転送しようとしています。

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ができなかった場合にディレクトリ内の特定のファイルを取得できます。 tパス名をファイルとして取得します。

もちろん、wholeディレクトリを転送したい場合(それがディレクトリの場合)、次のようにすることができます

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

パスがディレクトリまたはファイルのどちらであるかに関係なく機能します。

6
Kusalananda

次のコマンドを実行できます。

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
2
tonioc

エラーメッセージを気にせず、ドット以外のファイルのみをコピーする必要がある場合、これは迅速で汚いアプローチの1つです。

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

末尾のドットは、リモートファイルを現在のディレクトリにコピーします。好みに合わせて調整してください。 -pフラグは、タイムスタンプと権限を保持します。必要ない場合は省略してください。

1
roaima