"find -exec mv"コマンドラインの-maxlengthに関するヘルプ

"find -exec mv"コマンドラインの-maxlengthに関するヘルプ

私は、一連の文字列(ログファイル、履歴、データセットなど)に基づいて着信ファイルを処理するソート/フィルタcronスクリプトを開発しています。ソートするファイルはすべて共通フォルダの下にあり、一部はデフォルトフォルダに、一部はサブフォルダにあります。私は私の主な関心事であるDebian / bash(MX Linux)でこれを行っていますが、最終的にはDebian / ash(dCore Linux)システムに移動します。

  • ファイルとフォルダ名いつもSTRINGが含まれており、STRINGには大文字と小文字を混在させることができます。
  • ファイル名とファイルがあるサブフォルダは次のとおりです。両方STRINGを含めます。
  • フォルダそしてSTRINGにはファイルを含めることができます。いいえひも。親フォルダと一緒に移動する必要があります。
  • ファイル名とフォルダー名には、スペース、括弧、角括弧を含めることができます。

例:

/main/                                  # folder being searched
/main/filename.log                      # should not be moved 
/main/filename containing-STRING.log    # should be moved 
/main/subfolder/                        # should not be moved 
/main/subfolder/file.txt                # should not be moved 
/main/subfolder.with STRING in-name/    # should be moved 
/main/subfolder.with STRING in-name/STRING-file.log # should be moved along with parent
/main/subfolder.with STRING in-name/file.txt        # should be moved along with parent

私の出発点:

find . -iname '*STRING*' -exec mv {} ../offload/ \;

これは、「ファイルが見つかりません」エラーが発生しても機能します。それはおそらく、親フォルダが移動されたときにファイルがすでに移動されたためです。すべてのサブフォルダには常にSTRINGが含まれているため、そのコンテンツを必ず「見つける」必要はありません。親フォルダを移動するだけです。だから私はホームフォルダでのみSTRINGを「見つける」ために「-maxlength 0」を使ってみました。

find . -maxdepth 0 -iname '*STRING*' -exec mv {} ../offload/ \;

-maxlength スイッチを追加しても効果はありません。 「ファイルが見つかりません」という警告はありませんが、何も移動しません。私がどこに間違っているかについての提案はありますか?

編集:私はbashシェルとdCoreシステムとデフォルトのashシェルにのみアクセスできます。これはCLI専用のミニシステムなので、他のシェル環境を追加するスペースはありません。

私は試した:

find . -maxdepth 0 -type d -iname '*STRING*' -exec mv {} ../offload/ \;

実行するとエラーなしでプロンプトに戻りますが、何も移動しません。

@cas はい、ディレクトリ構造を保存する必要がありますが、どちらの例も検索を満たすべきではありません。 STRINGに一致するホームフォルダ内のファイルとディレクトリのみを見つけて移動したいと思います。したがって:

/main/filename-with-STRING              # match 
/main/folder-with-STRING/               # match 
/main/folder-with-STRING/foo/           # moved along with parent
/main/subfolder/filename-with-STRING    # no match 
/main/subfolder/folder-with-STRING/     # no match 

答え1

一致するすべてのディレクトリを最初に移動し、次に維持され、一致するすべてのファイル、シンボリックリンクを移動したいように聞こえます。

-type d最初のfind実行時にディレクトリを指定し、'(' -not -type d ')'2回目の実行時にディレクトリを指定しますfind

ただし、find最新のシェルを使用してこれを実行できます。

#!/usr/bin/zsh

# probably already enabled! So, just for reference:
setopt extended_glob
# also match "hidden" files, i.e., such that start with a dot
setopt dotglob
# we don't care about case!
setopt nocaseglob

# move all directories.
mv **/*STRING*(/) ../offload/
# move all non-directories
mv **/*STRING*(^/) ../offload/

関連情報