"と*を含むファイルを移動するとエラーが発生します。

"と*を含むファイルを移動するとエラーが発生します。

Bashスクリプトからファイルを移動する際に問題があります。私は同じ問題についてここで別の解決策を試しましたが、うまくいくものが見つかりませんでした。

最後の試みは追加することでしたが、shopt -s dotglob nullglob何も解決されませんでした。

今回のテストでは

jdir0="/media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)"


mv -v "$jdir0/*" "$jdir0/subs/" &>> $debuglog

..私は得る:

mv: cannot stat '/media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)/*': No such file or directory

しかし、はい、あります!

drwxrwx--- 1 root vboxsf   4096 Aug 22 07:06  ../
-rwxrwx--- 1 root vboxsf      0 Aug 21 17:19 'kallee.(222)..nnn.srt'*
-rwxrwx--- 1 root vboxsf 159363 Aug 21 17:26 'movie.test(2929).ismim.mp4'*
drwxrwx--- 1 root vboxsf      0 Aug 22 07:06  subs/

(これらの名前が本当に奇妙な理由は、この機能の前に無効な文字の削除をテストしているためです。)

更新:明らかに断続的なエラーが発生し、数日後に最終的にサーバーの問題(ファイルが保存されている場所)を追跡しました。明らかに、これらのエラーは、サーバーが保存/名前の変更を完了せず、スクリプトがサーバーに新しいタスクを実行するように要求した場合に発生します。たとえば、ファイルAの名前をBに変更し、最初の要求を実行する前にサーバーにBの名前をCに変更するように要求すると、サーバーにBが存在しないというメッセージが表示され、結果としてエラーコードが発生します。します。

答え1

*シェルのグローバル演算子です。認識するには、引用符を解除する必要があります。参照時には/media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)/*文字通りに渡され、名前付きmvファイルmvを移動しようとします*が、そのファイルはありません。

したがって、以下が必要です。

mv -v -- "$jdir0"/* "$jdir0/subs/" >> "$debuglog" 2>&1

を呼び出す前に、シェルが"$jdir0"/*一致するファイルのリストに展開されるようにしますmv

あなたはそうですいいえここでは、パターンに一致するファイルがないと呼び出しだけが使用され、混乱した構文エラーが発生するnullglobという意味なので、ここで必要でした。"$jdir0"/*mv-v--media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)/subs/mv

failglobこの場合、グローバルが一致しない場合にコマンドを中断する方が良いかもしれませんが、bashこの場合、コマンドが呼び出されるコンテキストに応じて中断が一貫しない方法で実行されるため、このオプションはスクリプトで役立ちます。起こるのは難しいです。

dotglobglob が隠しファイルと一致することを許可します。

globはファイルタイプに関係なくファイルと一致するため、上記*の内容も一致しますsubssubsディレクトリへのシンボリックリンクの場合、mvシンボリックsubsリンクをそのディレクトリに移動して、後続のすべての移動が失敗しますsubs。今消えた。subs通常のサブディレクトリの場合、ディレクトリmvを自分で移動できないと文句を言うことができます。

そのため、次のように書きたい場合があります。

shopt -s extglob
mv -v -- "$jdir0"/!(subs) "$jdir0/subs/" >> "$debuglog" 2>&1

!(pattern)すべてのファイル名に一致する ksh 拡張 glob 演算子はどこにありますか?いいえ一致patternするので、ここではを除いて移動しますsubs

またbash、シェルでは、非対話型シェルインスタンスでもリダイレクトターゲットに引用された引数拡張が必要です(bashがPOSIXモードの場合を除く)。


¹ bashとそのglob修飾子の代わりにzshを使用しない限り、たとえば*(.)move only定期的な文書

関連情報