bashで名前のないファイルを見つける方法は? [閉鎖]

bashで名前のないファイルを見つける方法は? [閉鎖]

私のサーバーにファイルを簡単にアップロードする次の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"スペースを保護することができますが、アスタリスクは消えます。

その名前のファイルが存在しない場合、この操作は失敗し、アスタリスクは変更されていません(nullglobbashオプションを設定しない限り)。 txtファイルが複数ある場合でも動作しません。しかし、これは常に動作します

for FILE in ../"$1"/*.txt; do whatever you want to do with `"$FILE"`; done

関連情報