私はこれに完全に驚きました。ログファイルをディレクトリに移動する週間スクリプトを実行しています。
mkdir 2022-04-30
mv *.* 2022-04-30/
これにより、拡張子を持つファイルだけが移動され、拡張子のないファイルは移動されません。
試してみると*.
ファイルが見つかりませんでした。
試してみると、*
好きなように動作しますが、ディレクトリ自体2022-04-30
を移動しようとし、エラーを印刷します。スクリプトには影響しませんが、何が起こっているのか理解したいと思います。
私は*
ゼロ個以上の文字を意味すると確信しています。したがって*.*
、すべてのファイルを移動する必要がありますが、ディレクトリは移動しないでください。
何が起こっているのか、ディレクトリを移動せずに必要なタスクを実行するスクリプトをどのように作成できますか?
CentOS 9/リリース
編集する:
ファイル名の例
2022-04-29abc.cde
2022-04-29 App
ベストアンサー1
*
0個以上の文字を表します。
したがって、一部の文字の後にドットがあり、その後により多くの文字があることを意味するので、 と一致するが*.*
中間の点が何とも一致しないため、拡張子のないファイルは移動しません。foo.bar
foo.
.bar
foo.bar.baz
foobar
foobar
*.
foo.
これは代わりにのみ一致しますfoo.bar
。なぜなら、aで終わる項目だけを見つけるからです。.
ディレクトリ以外のファイルのみを移動するには、次のようなものを使用することをお勧めします。これにより、サブディレクトリ内のファイルではなく現在のディレクトリ()内のすべてのfind . -maxdepth 1 -type f
ファイルが検索されます(制限すると、指定されたフォルダにのみすべてのコンテンツが含まれます)。単一レイヤーのサブフォルダなど)、通常のファイルのみフィルタリング.
maxdepth
maxdepth 1
maxdepth 2
-type f
find . -maxdepth 1 -type f -exec mv {} 2022-04-30/ \;
それはうまくいきますが、純粋なbashではないので、すべてのシステムに移植することはできません。
-exec
findがそれ以降のコンテンツを実行する場合、{}は順番にコマンドの各find
結果です。
(スペースと改行文字を含むファイル名を使用して簡単にテストしました。)
(コメントで無効なファイル名を使用するように編集されました)