私は、一連の文字列(ログファイル、履歴、データセットなど)に基づいて着信ファイルを処理するソート/フィルタ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/