リモートパスがディレクトリ(またはシンボリックリンクされたディレクトリ)を指しているのか、読み取り可能なファイルを指しているのかを確認する簡単な方法を探しています。
ディレクトリの場合は、そのディレクトリ内からローカルシステムに複数の特定のファイルをscp
できますが、ファイルの場合は、そのファイルのみをscp
できます。
scp
- manner asuser@Host:/path/to/dir-or-file
で指定されたファイルパスがあります。
注:ローカルシステム(WindowsのMobaXterm)では、bash
、scp
およびssh
が利用可能ですが、リモートシステム(パスが存在する場所にチェックしたい) )は完全なLinuxディストリビューションです。
ファイル(ファイルの場合)、またはディレクトリの一部(ディレクトリの場合)を転送しようとしています。
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
パスがディレクトリまたはファイルのどちらであるかに関係なく機能します。
次のコマンドを実行できます。
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
エラーメッセージを気にせず、ドット以外のファイルのみをコピーする必要がある場合、これは迅速で汚いアプローチの1つです。
scp -p asuser@Host:'/path/to/dir-or-file/*' asuser@Host:'/path/to/dir-or-file' .
末尾のドットは、リモートファイルを現在のディレクトリにコピーします。好みに合わせて調整してください。 -p
フラグは、タイムスタンプと権限を保持します。必要ない場合は省略してください。