私のサーバーにファイルを簡単にアップロードする次のbashがあります。
FILE=../"$1"/1.txt
scp 1.txt remoteserver #upload the file to a remote server.
$ 1は入力ディレクトリ用で、多くのディレクトリがあります。ただし、これらすべてのディレクトリのtxtファイル名は「1.txt」ではありません。私が確認できるのは、各ディレクトリにtxtファイルが1つだけ含まれていることです。
この場合、ファイルを見つける方法は?
修正する:
入ろうとしています。FILE=../"$1"/1.txt
ただし、次のようにファイルを確認する場合:
if [ -f "$FILE" ]
ファイルが存在してもエラーが発生することがわかりました。
私が見つけたもの:
$FILE
はい../test/1.txt
"$FILE"
はい../test/*.txt
それでは、これを削除する必要がありますか"
?
答え1
*
知らない名前を示すためにワイルドカードを使用できます。設定したと仮定
FILE=../"$1"/*.txt
ワイルドカード拡張は引用符の外でのみ発生します。$FILE
変数にはまだアスタリスクがあります。だから、
[ -f "$FILE" ]
等しい
[ -f "../test/*.txt" ]
ファイル名にアスタリスクが必要ですが、
[ -f $FILE ]
等しい
[ -f ../test/*.txt ]
拡張されました。
$FILE
パターンを保存するのは少し危険です。"$1"
スペースを含めると、引用符があるかどうかにかかわらず機能することはできません。引用符を使用するとスペースは保持されますが、アスタリスクも同じですが、スペースがない場合はスペースポイントで分割されます。を使用できますが、IFS
この場合、中間変数はとにかく最善の考えではありません。
人々はこのハッキングにこだわりますが、病的なファイル名がなくても機能します。あなたができることは、ファイル名を変数に保存する前に強制的に拡張することです。
FILE="$(echo ../"$1"/*.txt)"
アスタリスクは実際のファイル名に変わり、後で引用したバージョンを使用して"$FILE"
スペースを保護することができますが、アスタリスクは消えます。
その名前のファイルが存在しない場合、この操作は失敗し、アスタリスクは変更されていません(nullglob
bashオプションを設定しない限り)。 txtファイルが複数ある場合でも動作しません。しかし、これは常に動作します
for FILE in ../"$1"/*.txt; do whatever you want to do with `"$FILE"`; done